将 DataTable 导出至 Excel

3

可能是重复内容:
如何在C#中将DataTable导出到Excel

我在我的项目中包含了TemplateExcel,并且我想要将数据表导出到Excel,我希望能够将这个模板和数据一起拷贝并保存到任何我想要保存的地方,我该怎么做呢?


所以你有一个 DataTable,想要将它导出到 Excel 工作表中? - JMK
什么类型的数据库?如果是SQL Server,为什么不直接使用DTS http://technet.microsoft.com/en-us/library/cc917688.aspx或其他新的工具呢? - Liam
1
是的,但如果他只想从数据库中导出数据,他可以绕过DataTable。可能不适合解决方案,需要更多信息。 - Liam
好观点,我没有想到。 - JMK
如果您只想导出数据以便在Excel中查看,那么您可以直接将其导出为CSV格式,这样是可行的。 - LukeHennerley
显示剩余3条评论
2个回答

7
你可以通过Excel互操作来实现,像这样:

using System;
using System.Data;
using System.Runtime.InteropServices;
using Excel = Microsoft.Office.Interop.Excel;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main()
        {
            Excel.Application application = new Excel.Application();
            Excel.Workbook workbook = application.Workbooks.Add();
            Excel.Worksheet worksheet = workbook.Sheets[1];

            DataTable dataTable = new DataTable();
            DataColumn column = new DataColumn("My Datacolumn");

            dataTable.Columns.Add(column);
            dataTable.Rows.Add(new object[] {"Foobar"});

            var columns = dataTable.Columns.Count;
            var rows = dataTable.Rows.Count;

            Excel.Range range = worksheet.Range["A1", String.Format("{0}{1}", GetExcelColumnName(columns), rows)];

            object[,] data = new object[rows,columns];

            for (int rowNumber = 0; rowNumber < rows; rowNumber++)
            {
                for (int columnNumber = 0; columnNumber < columns; columnNumber++)
                {
                    data[rowNumber, columnNumber] = dataTable.Rows[rowNumber][columnNumber].ToString();
                }
            }

            range.Value = data;

            workbook.SaveAs(@"C:\test\whatever123.xlsx");
            workbook.Close();

            Marshal.ReleaseComObject(application);
        }

        private static string GetExcelColumnName(int columnNumber)
        {
            int dividend = columnNumber;
            string columnName = String.Empty;
            int modulo;

            while (dividend > 0)
            {
                modulo = (dividend - 1) % 26;
                columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
                dividend = (int)((dividend - modulo) / 26);
            }

            return columnName;
        }
    }
}

我在这里所做的就是创建一个 System.Data.DataTable 对象,填充一些数据,然后将其导出到 Excel。虽然需要进行清理、添加错误处理、重构等操作,但基础框架已经搭建好了。
特别感谢 Graham 提供的 GetExcelColumnName 方法。

0

嗯..workbook.SaveAs(@"C:\test\whatever123.xlsx"); 方法不能只有一个参数 :/ - Gëzim Shabani
谢谢大家,问题已经解决 :) - Gëzim Shabani
谢谢Aghilas,我还有一个问题,希望你能帮我。我是这样获取路径的:System.Windows.Forms.Application.StartupPath.Replace(@"bin\Debug", "\") + "something\myFile.xls"。当我安装程序时,真实路径是Program Files (x86),但是我调用路径的方式返回的是没有“(x86)”的Program Files,导致出现“路径未找到”的错误。你有什么想法可以获取正确的路径吗? - Gëzim Shabani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接