2010-07-19 74 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(); 
    } 
相关问题