2012-03-21 46 views
0

我使用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()); 
} 

回答

0

我們應用樣式

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

4

我建議你使用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

0

的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文件。