3

当我按下带有以下代码的按钮时,我喜欢制作 excel 文件,但我有 2 个错误。

Error 1: The type or namespace name 'ExcelPackage' could not be found

Error 2: var ds = query.CopyToDataTable();

按钮点击事件的代码如下:

using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Xml.Linq;
using System.Data.OleDb;
using Microsoft.Office.Interop.Excel;
using Microsoft.Office.Core;
using System.Reflection;
using System.ComponentModel;
using System.Collections.Generic;
using System.Data.Linq;
using System.Data.SqlClient;
using System.Drawing;
using System.Text;


public partial class Default2 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        var p = new ExcelPackage();
        var sheetName = "MyWorksheet";
        ExcelWorksheet ws = p.Workbook.Worksheets.Add(sheetName);


        ws.Cells.Style.Font.Size = 11; //Default font size for whole sheet
        ws.Cells.Style.Font.Name = "Calibri"; //Default Font name for whole sheet

        LinqBooksDataSet dataSet = new LinqBooksDataSet();
        FillDataSetUsingLinqToSql2(dataSet);

        // Query the DataTables
        var query =
         from publisher in dataSet.Publisher
        join book in dataSet.Book
        on publisher.ID equals book.Publisher
        select new
       {
    Publisher = publisher.Name,
    Book = book.Title
};

        var ds = query.CopyToDataTable();

        if (ds.Tables.Count > 0 && ds.Rows.Count > 0)
        {
            ws.Cells["A1"].LoadFromDataTable(ds, true);
            Response.BinaryWrite(p.GetAsByteArray());
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AddHeader("content-disposition", "attachment;  filename=" + sheetName + ".xlsx");
        }

    }
    private static void FillDataSetUsingLinqToSql2(LinqBooksDataSet dataSet)
    {
        // Prepare the LINQ to SQL DataContext
        var linqBooks = new LinqBooksDataContext();

        // Query the Publisher table
        var publisherQuery =
          from publisher in linqBooks.Publishers
          select new { publisher.ID, publisher.Name };
        // Query the Book table
        var bookQuery =
          from book in linqBooks.Books
          where book.PubDate.Value.Year > 1950
          select new
          {
              book.ID,
              book.Title,
              book.Subject


          };

        // Execute the queries and load the data into the DataSet
        foreach (var publisher in publisherQuery)
        {
            dataSet.Publisher.AddPublisherRow(
            publisher.ID, publisher.Name, null, null);
        }
        foreach (var book in bookQuery)
        {
            dataSet.Book.AddBookRow(book.ID, book.Title, book.Subject);

        }
    }
}
4

1 回答 1

7

我假设您正在使用EPPLus. 但是,您需要添加using OfficeOpenXml;.

using OfficeOpenXml;

// ...


using (var pck = new OfficeOpenXml.ExcelPackage())
{
    using (var stream = File.OpenRead(path))
    {
        pck.Load(stream);
    }
    // ...
}

下一个异常query.CopyToDataTable();是由于这CopyToDataTable是一个扩展方法,IEnumerable<DataRow>但您的查询是一个IEnumerable<anonymous type>. 所以这根本行不通。您需要DataRows能够从中创建一个新DataTable的。

如果您想将它与任何类型一起使用,您可以在我的其他答案中使用这里的方法:

为什么我不能在 LINQ 查询中使用 .CopyToDataTable?

于 2012-12-11T12:03:37.573 回答