DataTable到Excel通过响应对象导出

问题描述:

我使用asp.net Response对象创建了一个excel文件。但在这个文件中,长号码会自动变为科学记数法。我怎样才能防止这一点?DataTable到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()); 
} 

我们应用样式

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(); 
       } 
      } 
     } 
+0

谢谢你的回答。我已经尝试过,但没有奏效。我将再次尝试这个示例函数。 – newbie 2012-03-22 15:15:20

我建议你使用EPPlus和导出数据表到真实的XLSX文件,这是很简单的,用这种方法,你可以创建excel文件并将其存储到内存流中:

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; 
} 

,然后投放流到客户端:

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; 
+0

非常感谢您的回答,但我不能使用任何办公室图书馆。但是如果我需要使用,我会记住你的答案。 – newbie 2012-03-22 15:12:27

的DataTable到Excel导出通过响应对象

一个简单的方法做,这是我的自由C#类添加到您的项目,然后添加一行代码,调用它的“CreateExcelDocument”功能:

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

就是这样!

完整信息(包括提供免费下载的源代码,并举例项目)在这里:

Export to Excel C# class

我的图书馆使用免费微软的OpenXML库(在我的下载也提供)写入文件,所以你不必使用重量级的VSTO库,或者在你的服务器上安装了Excel。

同时,它会创建一个真正的.xlsx文件,而不是写入数据流,以逗号分隔的文本文件中的一些其他的方法,但它命名为.xls文件。