将数据表转换为 excel 2007(.xlsx)

Posted

技术标签:

【中文标题】将数据表转换为 excel 2007(.xlsx)【英文标题】:Convert datatable to excel 2007(.xlsx) 【发布时间】:2011-03-18 00:39:08 【问题描述】:

我有一个DataTable 我需要输入 Excel 2007 格式并将其保存为 2007 的 excel 文件(.xlsx)。

谁能帮我实现这个目标?

【问题讨论】:

【参考方案1】:

您可以使用 OLEDB 数据提供程序并将 Excel 视为另一个 ADO.NET 数据源,以便循环遍历您的 DataTable 行并将它们插入 Excel 电子表格。这是一篇 Microsoft 知识库文章,可向您介绍许多详细信息。

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

要记住的重要一点是,您可以在工作簿中创建工作簿和工作表,并且可以通过在名称末尾附加“$”来引用现有工作表。如果您省略工作表名称末尾的“$”,OLEDB 提供程序将假定它是一个新工作表并尝试创建它。

跟在后面的美元符号 工作表名称表明 该表存在。如果您正在创建 一个新表,如 创建新的工作簿和表格 本文的部分,请勿使用 美元符号。

您可以在 2003 (.xls) 或 2007 格式 (xlsx) 中创建和电子表格,这是在您的连接字符串中定义的 - 您指定要写入的文件,只需指定扩展名。确保您使用正确的 OLEDB 提供程序版本。

如果要创建 2003 (.xls) 版本,请使用此连接字符串:

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

如果要创建 2007 (.xlsx) 版本,请使用此连接字符串:

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

您可能必须从 Microsoft 下载 ACE 提供程序才能创建 XLSX 文件。你可以找到它here。

我通常使用 XLS 提供程序,所以我使用 XLSX 提供程序的次数不多。

希望这会有所帮助。如果您还有其他问题,请告诉我。

【讨论】:

我做了确切的事情。但是当我创建 XLSX 文件时,它会被创建,但是当我尝试打开它时,它显示文件已损坏。我该怎么办。我在您提供的上述 MS 链接中遵循了相同的步骤 请注意,它将使用列中的前 5 到 8 个值来“猜测”其数据类型。然后它将任何不符合的值设置为 NULL。 IE。如果您有一列包含以下值,例如电话号码:004412345677, 00443777373, [... 这里还有几个号码... ], +44(22)3883774747, [.... 还有一些电话号码加号和方括号...] 等 - 所有这些非数字电话号码很可能会在您的结果文件中设置为 NULL。修复此设计缺陷的方法需要调整注册表。其他选项可能是使用 OpenXML SDK 2.5 - 从 Microsoft 免费下载。【参考方案2】:

前段时间我为公司编写了以下代码。它采用任何类类型的 Enumerable 并将其所有(获取)属性导出到 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();
        
    

【讨论】:

【参考方案3】:

我有一个需要放入 Excel 2007 格式并保存的 DataTable 作为 2007 年的 excel 文件 (.xlsx)。

谁能帮我实现这个目标?

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

完整的详细信息(带有可免费下载的源代码和示例项目)在这里:

Mikes Knowledge Base - Export to Excel

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

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

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

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

【讨论】:

【参考方案4】:

在我 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

【讨论】:

@hey,我正在尝试做同样的事情......但没有成功......你能回复我的帖子......谢谢我的问题(***.com/questions/13737495/…) 【参考方案5】:

看到其他人发布了“保存到 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();
    

【讨论】:

以上是关于将数据表转换为 excel 2007(.xlsx)的主要内容,如果未能解决你的问题,请参考以下文章

Excel xls和xlsx有啥区别

怎么把xls文件转换成excel文件格式

我安装的是EXCEL2003版和07兼容包,,,,,在打开.xlsx文件时显示转换器未保存文件怎么解决?

XLSX.js读取excel日期格式时 将数字转换为正常日期格式

java怎么将xlsx转换成csv格式

怎么讲csv格式转换为xlsx