如何使用DataTable和ExcelLibrary创buildExcel工作表?

我有数据表,其中不包含任何列的date与“date”数据types。 我试过下面的选项

1)第三部分DLL- ExcelLibrary如果数据集中没有date列,那么它工作正常,否则它会使用一些类似-65284的虚拟值而不是date。

ExcelLibrary.DataSetHelper.CreateWorkbook(@"C:\Users\ABC\Documents\Excel\Report123.xls", ds); 

2)使用简单的导出格式而不使用第三方DLL

 public void ExportToExcel(System.Data.DataTable dt) { if (dt.Rows.Count > 0) { string filename = "Report123.xls"; System.IO.StringWriter tw = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(tw); DataGrid dgGrid = new DataGrid(); dgGrid.DataSource = dt; dgGrid.DataBind(); //Get the HTML for the control. dgGrid.RenderControl(hw); //Write the HTML back to the browser. //Response.ContentType = application/vnd.ms-excel; Response.ContentType = "application/vnd.ms-excel"; Response.AppendHeader("Content-Disposition", "attachment; filename=" + filename + ""); this.EnableViewState = false; Response.Write(tw.ToString()); Response.End(); } } 

在上面的代码完美地提取Excel,但是当我们打开相同的Excel时,它会得到格式错误的错误。

我也想读取数据库中的同一个文件存储在数据库中。 当我去阅读创buildExcel(第二选项),然后我得到错误,外部表格不是在预期的格式。 如果我保存为相同的文件,那么它的工作文件。

但是我不想每次都做“另存为”文件。 请帮帮我

更新:

 public void ExportToExcel1(System.Data.DataTable dt) { //clear the response of any junk. This may not be necessary Response.Clear(); //add a header so it has a nice file name Response.AddHeader("content-disposition", "attachment;filename=Reportengg.xlsx"); //Set the MIME type correctly Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; //create a new package, this is the equivalent of an XLSX file. var package = new ExcelPackage(); //Add a new sheet to the workbook var sheet = package.Workbook.Worksheets.Add("Sheet1"); //EPPlus contains helper function to load data from a DataTable, though you could manually fill in rows/column values yourself if you want sheet.Cells["A1"].LoadFromDataTable(dt, true); // byte[] array = package.GetAsByteArray(); //write the file bytes to the response Response.BinaryWrite(package.GetAsByteArray()); //end the response so we don't send anymore down and corrupt the file Response.End(); } 

你的#1技术是将文件保存在服务器上 。 服务器端代码不能直接保存到客户端文件系统。 您必须将文件字节写入响应,然后客户端的PC将select如何处理它。 无论他们select“另存为”还是直接保存到某个“下载”文件夹,都取决于其浏览器设置。 我不熟悉ExcelLibrary但我想他们有某种API来获取文件字节? 去做。 然后将这些字节写入响应。

 byte[] bytes = GetBytesFromTheirApiSomehow(); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.AppendHeader("Content-Disposition", "attachment; filename=filename.xlsx"); Response.BinaryWrite(bytes); Response.End(); 

我看了一下ExcelLibrary源代码。 这个库似乎不再被维护。 也许你应该转向一个积极维护的图书馆,比如EPPlus 。 EPPlus的实现可能如下所示:

 public void ExportToExcel(System.Data.DataTable dt) { //clear the response of any junk. This may not be necessary Response.Clear(); //add a header so it has a nice file name Response.AddHeader("content-disposition", "attachment;filename=myexcelfile.xlsx"); //Set the MIME type correctly Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; //create a new package, this is the equivalent of an XLSX file. var package = new ExcelPackage(); //Add a new sheet to the workbook var sheet = package.Workbook.Worksheets.Add("My Data"); //EPPlus contains helper function to load data from a DataTable, though you could manually fill in rows/column values yourself if you want sheet.Cells["A1"].LoadFromDataTable(dt, true); //write the file bytes to the response Response.BinaryWrite(package.GetAsByteArray()); //end the response so we don't send anymore down and corrupt the file Response.End(); } 

这对我工作:

  Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", string.Format("attachment; filename={0}", "Report123.xls")); Response.ContentType = "application/vnd.ms-excel"; System.IO.StringWriter sw = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter hw = new System.Web.UI.HtmlTextWriter(sw); GridView1.AllowPaging = false; GridView1.RenderControl(hw); Response.Write(sw.ToString()); Response.End();