将datatable转换为excel 2007(.xlsx)

我有一个DataTable我需要把Excel 2007格式,并保存为Excel文件(.xlsx)2007年。

任何人都可以帮助我做到这一点?

您可以使用OLEDB数据提供程序,并将Excel作为另一个ADO.NET数据源,以循环访问DataTable行并将其插入到Excel电子表格中。 以下是Microsoft知识库文章,详细介绍了许多细节。

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

需要牢记的是,您可以在工作簿中创build工作簿和工作表,并且可以通过在名称末尾附加“$”来引用现有工作表。 如果在工作表名称末尾省略“$”,则OLEDB提供者会认为这是一个新工作表,并将尝试创build它。

工作表名称后面的美元符号表示该表存在。 如果您正在创build一个新的表,如本文的创build新的工作簿和表部分所述,请不要使用美元符号。

您可以在2003(.xls)或2007格式(xlsx)中创build和电子表格,并在连接string上定义 – 指定要写入的文件,并指定扩展名。 确保您使用正确的OLEDB提供程序版本。

如果你想创build一个2003(.xls)版本,你可以使用这个连接string:

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

如果您要创build2007(.xlsx)版本,请使用以下连接string:

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

您可能需要从Microsoft下载ACE提供程序才能创buildXLSX文件。 你可以在这里find它。

我通常使用XLS提供程序,所以我还没有像XLSX提供程序那么多。

希望这可以帮助。 如果您有其他问题,请告诉我。

我后来为公司写了下面的代码。 它需要任何类types的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(); } } 

我有一个DataTable我需要把Excel 2007格式,并保存为Excel文件(.xlsx)2007年。

任何人都可以帮助我做到这一点?

您只需要将我的免费C#类添加到您的项目和一行代码。

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

迈克知识库 – 导出到Excel

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

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

顺便说一下,使用OLEDB写入Excel文件时遇到了一些困难,尤其是因为我运行的是Windows 7 64位版本,Office 2007(32位版本),Microsoft ACE提供商必须是 64位版本版本…但是,如果您安装了32位版本的Office,则无法安装。

因此,您必须卸载Office,安装ACE驱动程序,然后重新安装Office。
但即使如此,我放弃使用OLEDB ..它只是不够稳定。

在一些我5年前应该工作的旧代码中find了这个…

 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,它应该只需要replace下面的代码就行了:

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

CSV是最简单的方法,如果你不需要做任何复杂的事情。 如果您确实需要它是真正的本机格式的Excel 2007文件,您将需要使用Office库来构build它或从CSV转换它,然后提供/保存它。

这个链接也可能是有用的:

将数据导出到Excel 2007时如何避免Excel提示窗口

你将不得不做很多互操作,这里是一个教程,希望它有帮助。 链接文本

看到别人发布了“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(); }