I like to make excel file when I press the the button with below code, but I have 2 errors.
Error 1: The type or namespace name 'ExcelPackage' could not be found
Error 2: var ds = query.CopyToDataTable();
the code for button click event is like below:
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);
}
}
}
I assume that you're using EPPLus
. However, you need to add using OfficeOpenXml;
.
using OfficeOpenXml;
// ...
using (var pck = new OfficeOpenXml.ExcelPackage())
{
using (var stream = File.OpenRead(path))
{
pck.Load(stream);
}
// ...
}
The next exception on query.CopyToDataTable();
is caused by the fact that CopyToDataTable
is an extension method for IEnumerable<DataRow>
but your query is an IEnumerable<anonymous type>
. So that does simply not work this way. You need DataRows
to be able to create a new DataTable
from it.
If you want to use it with any type you could use the method here in my other answer:
Why I can't use .CopyToDataTable in LINQ query?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With