将datatable转换为excel 2007(.xlsx)

时间:2010-07-19 17:03:53

标签: c# excel datatable

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

任何人都可以帮我实现这个目标吗?

6 个答案:

答案 0 :(得分:8)

您可以使用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提供程序。

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

答案 1 :(得分: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 :(得分:2)

  

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

     

任何人都可以帮我实现这个目标吗?

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

详细信息(可免费下载的源代码和示例项目):

Mikes Knowledge Base - Export to Excel

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

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

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

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

答案 3 :(得分: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

答案 4 :(得分:0)

你必须做很多互操作,这是一个教程,希望它有所帮助。 link text

答案 5 :(得分:0)

看到其他人发布了&#34;保存到csv&#34;选项。虽然这似乎不是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();
    }