2010-07-19 25 views

回答

8

您可以使用OLEDB數據提供程序,並將Excel作爲另一個ADO.NET數據源,以循環訪問DataTable行並將它們插入到Excel電子表格中。這裏有一篇Microsoft知識庫文章,詳細介紹了許多細節。

http://support.microsoft.com/kb/316934/en-us

最重要的事情要記住的是,你可以在工作簿中創建工作簿和牀單,您可以通過在名稱末尾附加一個「$」引用現有的表。如果您在工作表名稱末尾省略'$',則OLEDB提供者會認爲它是一張新工作表並將嘗試創建它。

繼 工作表名稱美元符號是 表中存在的指示。如果您正在創建 一個新表,如本文的 創建新工作簿和表 部分所述,請勿使用 美元符號。

您可以在2003(.xls)或2007格式(xlsx)中創建和電子表格,並在連接字符串中定義 - 指定要寫入的文件,並指定延期。確保您使用正確的OLEDB提供程序版本。

如果你想創建一個2003(.xls的)版本,您可以使用此連接字符串:如果你想創建一個2007(.xlsx)格式版本

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Book1.xls;Extended Properties="Excel 8.0;HDR=YES 

,您可以使用此連接字符串:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Book1.xlsx;Extended Properties="Excel 12.0;HDR=YES 

您可能必須從Microsoft下載ACE提供程序才能創建XLSX文件。你可以找到它here

我通常使用XLS提供程序,所以我沒有使用XLSX提供程序。

希望這會有所幫助。如果您有其他問題,請告訴我。

+0

我做了確切的事情。但是當我創建XLSX文件時,它創建了,但是當我嘗試打開它時,它顯示文件已損壞。我該怎麼辦。我遵循了您提供的Above MS鏈接中的相同步驟 – smilu 2013-01-13 07:59:52

+0

請注意,它將使用列中前5到8個值來「猜測」其數據類型。然後它會將任何不符合的值設置爲NULL。即如果您的電話號碼爲:004412345677,00443777373,[...此處有多個號碼...],+44(22)3883774747,[...還有一些電話號碼與以下值加號和括號...]等 - 所有這些非數字電話號碼很可能會被放在您的結果文件爲NULL。解決這個設計缺陷的一種方法需要調整註冊表。其他選項可能使用OpenXML SDK 2.5 - 從微軟免費下載。 – demp 2013-02-18 12:32:45

1

在一些舊的代碼,我不喜歡5年前應該努力找到這個......

public static void DataTableToExcel(DataTable tbl) 
{ 
    HttpContext context = HttpContext.Current; 
    context.Response.Clear(); 
    foreach (DataColumn c in tbl.Columns) 
    { 
     context.Response.Write(c.ColumnName + ";"); 
    } 
    context.Response.Write(Environment.NewLine); 
    foreach (DataRow r in tbl.Rows) 
    { 
     for (int i = 0; i < tbl.Columns.Count; i++) 
     { 
      context.Response.Write(r[i].ToString().Replace(";", string.Empty) + ";"); 
     } 
     context.Response.Write(Environment.NewLine); 
    } 
    context.Response.ContentType = "text/csv"; 
    context.Response.AppendHeader("Content-Disposition", 
     "attachment; filename=export.csv"); 
    context.Response.End(); 
} 

從ASP.NET這將輸出與Excel 2007中可以打開CSV文件的響應。如果你願意,你可以擴展名更改爲模仿Excel和它應該只是通過更換以下行工作:

context.Response.ContentType = "application/vnd.ms-excel"; 
    context.Response.AppendHeader("Content-Disposition", 
     "attachment; filename=export.xlsx"); 

一個CSV是最簡單的方式,如果你不需要做任何事情複雜。如果您確實要求它是真正的本機格式的Excel 2007文件,則需要使用Office庫來構建它或將其從CSV轉換並提供/保存。

這個環節也可能是有用的:

How to avoid the Excel prompt window when exporting data to Excel 2007

+0

@hey,我很tryn做同樣的事情......但沒有成功....可以ü答覆馬後....感謝我的問題(http://stackoverflow.com/questions/13737495/format-error-while-exporting-to-excel-from-gridview-in-asp-淨) – Kulkarni 2012-12-07 04:52:44

0

你必須做大量的互操作的,這裏是一個教程,希望它幫助。 link text

3

我後來爲公司編寫了以下代碼。它需要Enumerable的任何類類型,並將其所有(get)屬性導出到Excel中,並打開Excel。你應該可以爲DataTable做類似的事情。記住,你需要添加引用的Microsoft.Office.Interop.Excel

public static void ExportToExcel<T>(IEnumerable<T> exportData) 
    { 
     Excel.ApplicationClass excel = new Excel.ApplicationClass(); 
     Excel.Workbook workbook = excel.Application.Workbooks.Add(true); 
     PropertyInfo[] pInfos = typeof(T).GetProperties(); 
     if (pInfos != null && pInfos.Count() > 0) 
     { 
      int iCol = 0; 
      int iRow = 0; 
      foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true)) 
      { 
       // Add column headings... 
       iCol++; 
       excel.Cells[1, iCol] = eachPInfo.Name; 
      } 
      foreach (T item in exportData) 
      { 
       iRow++; 
       // add each row's cell data... 
       iCol = 0; 
       foreach (PropertyInfo eachPInfo in pInfos.Where(W => W.CanRead == true)) 
       { 
        iCol++; 
        excel.Cells[iRow + 1, iCol] = eachPInfo.GetValue(item, null); 
       } 

      } 
      // Global missing reference for objects we are not defining... 
      object missing = System.Reflection.Missing.Value; 
      // If wanting to Save the workbook... 
      string filePath = System.IO.Path.GetTempPath() + DateTime.Now.Ticks.ToString() + ".xlsm"; 
      workbook.SaveAs(filePath, Excel.XlFileFormat.xlOpenXMLWorkbookMacroEnabled, missing, missing, false, false, Excel.XlSaveAsAccessMode.xlNoChange, missing, missing, missing, missing, missing); 
      // If wanting to make Excel visible and activate the worksheet... 
      excel.Visible = true; 
      Excel.Worksheet worksheet = (Excel.Worksheet)excel.ActiveSheet; 
      excel.Rows.EntireRow.AutoFit(); 
      excel.Columns.EntireColumn.AutoFit(); 
      ((Excel._Worksheet)worksheet).Activate(); 
     } 
    } 
2

我有一個數據表,我需要投入Excel 2007中的格式和 保存爲Excel文件格式(.xlsx)2007年

任何人都可以幫助我實現這一目標嗎?

您只需將我的免費C#類添加到您的項目和一行代碼。

完整信息(包括提供免費下載的源代碼,並舉例項目)在這裏:

Mikes Knowledge Base - Export to Excel

我的圖書館使用免費微軟的OpenXML庫(在我的下載也提供)寫入文件,所以你不必使用重量級的VSTO庫,或者在你的服務器上安裝了Excel。

此外,它會創建一個實際 .xlsx文件,而不是其他一些將數據流寫入逗號分隔文本文件的方法,但將其命名爲.xls文件。

順便說一句,我有負載的使用OLEDB,這不僅是因爲我運行的是Windows 7 64位寫入Excel文件困難,與Office 2007(這是32位)和Microsoft ACE提供商必須是的64位版本......但如果您安裝了32位版本的Office,則無法安裝此版本。

因此,您必須卸載Office,安裝ACE驅動程序,然後重新安裝Office。
但即使如此,我放棄使用OLEDB ..它只是不夠穩定。

0

看到別人發佈了「save to csv」選項。雖然這似乎並沒有成爲OP一直在尋找答案,這裏是我的版本,其中包括該表的標題

public static String ToCsv(DataTable dt, bool addHeaders) 
    { 
     var sb = new StringBuilder(); 
     //Add Header Header 
     if (addHeaders) 
     { 
      for (var x = 0; x < dt.Columns.Count; x++) 
      { 
       if (x != 0) sb.Append(","); 
       sb.Append(dt.Columns[x].ColumnName); 
      } 
      sb.AppendLine(); 
     } 
     //Add Rows 
     foreach (DataRow row in dt.Rows) 
     { 
      for (var x = 0; x < dt.Columns.Count; x++) 
      { 
       if (x != 0) sb.Append(","); 
       sb.Append(row[dt.Columns[x]]); 
      } 
      sb.AppendLine(); 
     } 
     return sb.ToString(); 
    } 
相關問題