DataTable到Excel通过响应对象导出

我使用asp.net Response对象创build了一个excel文件。 但是在这个文件中,长号码会自动变成科学记数法。 我怎样才能防止这个?

private void WriteToExcelFile(DataTable dt) { StringWriter sw = new StringWriter(); sw.Write("Kolon_1\t"); sw.Write("Kolon_2\t"); for (int i = 0; i < dt.Rows.Count; i++) { DataRow dr = dt.Rows[i]; sw.Write("\n"); sw.Write(dr["Ad"].ToString() + "\t"); sw.Write(dr["Numara"].ToString() + "\t"); } Response.Output.Write(sw.ToString()); } 

我build议您使用EPPlus并将DataTable导出到真正的xlsx文件中,这非常简单,您可以使用此方法创buildexcel文件并将其存储到内存stream中:

 public static MemoryStream DataTableToExcelXlsx(DataTable table, string sheetName) { MemoryStream Result = new MemoryStream(); ExcelPackage pack = new ExcelPackage(); ExcelWorksheet ws = pack.Workbook.Worksheets.Add(sheetName); int col = 1; int row = 1; foreach (DataRow rw in table.Rows) { foreach (DataColumn cl in table.Columns) { if (rw[cl.ColumnName] != DBNull.Value) ws.Cells[row, col].Value = rw[cl.ColumnName].ToString(); col++; } row++; col = 1; } pack.SaveAs(Result); return Result; } 

然后为客户提供该stream:

 MemoryStream ms = DataTableToExcelXlsx(myDataTable, "Sheet1"); ms.WriteTo(Response.OutputStream); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.AddHeader("Content-Disposition", "attachment;filename=DataTable.xlsx"); Response.StatusCode = 200; 

我们应用风格

 r.Cells[columnIndex].Attributes.Add("class", "text"); System.Text.StringBuilder style = new System.Text.StringBuilder(); style.Append("<style>"); style.Append("." + "text" + " { mso-number-format:" + "\\@;" + " }"); style.Append("</style>"); response.Clear(); Response.Buffer = true; //response.Charset = ""; //response.Write(sw.ToString()); Response.Write(style.ToString()); 

示例函数

  public void GenerateXLS(string pFileName, DataTable pdtSource) { HttpResponse response = HttpContext.Current.Response; response.Clear(); response.Charset = ""; // set the response mime type for excel if ((pFileName + "-").ToLower().Contains(".xlsx-")) { response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; } else { response.ContentType = "application/vnd.ms-excel"; } response.AddHeader("Content-Disposition", "attachment;filename=\"" + pFileName + "\""); // create a string writer using (StringWriter sw = new StringWriter()) { using (HtmlTextWriter htw = new HtmlTextWriter(sw)) { // instantiate a datagrid GridView gvExport = new GridView(); gvExport.DataSource = pdtSource; gvExport.DataBind(); //(start): require for date format issue HtmlTextWriter hw = new HtmlTextWriter(sw); foreach (GridViewRow r in gvExport.Rows) { if (r.RowType == DataControlRowType.DataRow) { for (int columnIndex = 0; columnIndex < r.Cells.Count; columnIndex++) { r.Cells[columnIndex].Attributes.Add("class", "text"); } } } //(end): require for date format issue gvExport.RenderControl(htw); //(start): require for date format issue System.Text.StringBuilder style = new System.Text.StringBuilder(); style.Append("<style>"); style.Append("." + "text" + " { mso-number-format:" + "\\@;" + " }"); style.Append("</style>"); response.Clear(); Response.Buffer = true; //response.Charset = ""; //response.Write(sw.ToString()); Response.Write(style.ToString()); Response.Output.Write(sw.ToString()); Response.Flush(); //(end): require for date format issue try { response.End(); } catch (Exception err) { } //HttpContext.Current.ApplicationInstance.CompleteRequest(); } } } 

DataTable到Excel通过响应对象导出

一个简单的方法是将我的免费C#类添加到您的项目中,然后添加一行代码,将其称为“CreateExcelDocument”函数:

 DataTable dt = CreateSampleData(); string excelFilename = "C:\\Sample.xlsx"; CreateExcelFile.CreateExcelDocument(ds, excelFilename); 

而就是这样!

全部细节(可免费下载的源代码和一个示例项目)在这里:

导出到Excel C#类

我的库使用免费的Microsoft OpenXML库(也在我的下载中提供)来编写文件,因此您不必使用重量级VSTO库,或者在服务器上安装Excel。

此外,它创build一个真正的.xlsx文件,而不是其他一些将数据stream写入逗号分隔的文本文件的方法,但将其命名为.xls文件。