导出数据集到Excel 2007 EPPlus

我试图导出一个数据集到Excel 2007,我不能使用正常的代码,用于导出使用内容types的MIMEtypes,如“Response.ContentType =”application / ms-excel“;” 如果我使用MIMEtypes的xls我得到一个警告,当ai尝试导出,我不能有这个错误,因为客户端,所以我开始使用EPPlus,但现在我有期待erros,像“ArgumentNullException是未处理用户代码“。当我debbuging我注意到在btnExportClick方法中的variablesds是null,我认为这是erros是,但我不明白在哪里,这里是完整的代码:

namespace PortalFornecedores { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { if (!this.IsPostBack) { this.BindGrid(); } } public void BindGrid() { using (DataSet ds = new DataSet()) { ds.ReadXml(Server.MapPath("~/Customers.xml")); GridFornecedor.DataSource = ds; GridFornecedor.DataBind(); } } public void btnExportClick(object sender, EventArgs e) { DataTable ds = GridFornecedor.DataSource as DataTable; ExportExcel(ds); } public void ExportExcel(DataTable ds) { using (ExcelPackage pck = new ExcelPackage()) { //Create the worksheet ExcelWorksheet ws = pck.Workbook.Worksheets.Add("SearchReport"); //Load the datatable into the sheet, starting from cell A1. Print the column names on row 1 ws.Cells["A1"].LoadFromDataTable(ds, true); //prepare the range for the column headers string cellRange = "A1:" + Convert.ToChar('A' + ds.Columns.Count - 1) + 1; //Format the header for columns using (ExcelRange rng = ws.Cells[cellRange]) { rng.Style.WrapText = false; rng.Style.HorizontalAlignment = ExcelHorizontalAlignment.Left; rng.Style.Font.Bold = true; rng.Style.Fill.PatternType = ExcelFillStyle.Solid; //Set Pattern for the background to Solid rng.Style.Fill.BackgroundColor.SetColor(Color.Gray); rng.Style.Font.Color.SetColor(Color.White); } //prepare the range for the rows string rowsCellRange = "A2:" + Convert.ToChar('A' + ds.Columns.Count - 1) + ds.Rows.Count * ds.Columns.Count; //Format the rows using (ExcelRange rng = ws.Cells[rowsCellRange]) { rng.Style.WrapText = false; rng.Style.HorizontalAlignment = ExcelHorizontalAlignment.Left; } //Read the Excel file in a byte array Byte[] fileBytes = pck.GetAsByteArray(); //Clear the response Response.Clear(); Response.ClearContent(); Response.ClearHeaders(); Response.Cookies.Clear(); //Add the header & other information Response.Cache.SetCacheability(HttpCacheability.Private); Response.CacheControl = "private"; Response.Charset = System.Text.UTF8Encoding.UTF8.WebName; Response.ContentEncoding = System.Text.UTF8Encoding.UTF8; Response.AppendHeader("Content-Length", fileBytes.Length.ToString()); Response.AppendHeader("Pragma", "cache"); Response.AppendHeader("Expires", "60"); Response.AppendHeader("Content-Disposition", "attachment; " + "filename=\"ExcelReport.xlsx\"; " + "size=" + fileBytes.Length.ToString() + "; " + "creation-date=" + DateTime.Now.ToString("R") + "; " + "modification-date=" + DateTime.Now.ToString("R") + "; " + "read-date=" + DateTime.Now.ToString("R")); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; //Write it back to the client Response.BinaryWrite(fileBytes); Response.End(); } } public override void VerifyRenderingInServerForm(Control control) { /* Confirms that an HtmlForm control is rendered for the specified ASP.NET server control at run time. */`enter code here` } } 

夫妇的事情。 这不是一个真正的问题,更普遍的networking。

首先,在这里将网格DataSource设置为dataSET:

 using (DataSet ds = new DataSet()) { ds.ReadXml(Server.MapPath("~/Customers.xml")); GridFornecedor.DataSource = ds; 

但后来在这里铸造成一个数据表:

 DataTable ds = GridFornecedor.DataSource as DataTable; 

当你第一次投射到一个数据集,然后得到它的表集合的第一个表。

但是这仍然不能解决问题,因为你有一个不会跨回发的类级别的对象。 你需要使用像这样的会话或视图状态variables:

 public void BindGrid() { using (DataSet ds = new DataSet()) { ds.ReadXml(Server.MapPath("~/Customers.xml")); GridFornecedor.DataSource = ds; GridFornecedor.DataBind(); ViewState["GridDataSource"] = ds; } } public void btnExportClick(object sender, EventArgs e) { //DataTable ds = GridFornecedor.DataSource as DataTable; var ds = ViewState["GridDataSource"] as DataSet; var dt = ds.Tables[0]; ExportExcel(dt); }