IRONSOFTWAREHOME
USING IRONXL

C# DataGridView 导出到 Excel:完整格式指南 | IronXL

Curtis Chau
Curtis Chau
Updated: 2026年6月28日

C# DataGridView 导出到 Excel 并格式化:完整指南:图像1 - C# DataGridView 导出到 Excel 并格式化

DataGridView 数据导出到 Excel 文件是 Windows Forms 开发中最常见的任务之一。 在构建显示表格数据的商业应用程序时——无论是销售报告、库存记录还是客户列表——用户都期望点击按钮后,能获得格式规范的 Excel 文件,以便进行分享或进一步分析。 挑战在于以简洁的方式实现这一目标,既不依赖每台终端用户机器上安装的 Microsoft Excel,也不必处理那些会导致内存泄漏或静默崩溃的 COM 互操作清理代码。 本指南引导您完成使用IronXL在C#中将DataGridView导出到Excel的完整过程,从项目设置到高级单元格格式化,让您最终得到生产就绪的代码。

第一步:
arrow pointer

如何为 DataGridView 导出功能设置 Windows Forms 项目?

DataGridView数据导出的传统方法依赖于Microsoft Interop——您需要打开"添加引用",导航到COM选项卡,选择Microsoft Excel对象库,并编写脆弱的代码,通过调用Marshal.ReleaseComObject来避免内存泄漏。 这种模式需要在每台运行应用程序的计算机上安装Microsoft Excel,在处理大数据集时性能较慢,并且在没有Office许可证的部署环境中经常产生COMException错误。 微软关于 Office 自动化的官方指南明确建议在服务器端和自动化场景中使用第三方库。

IronXL 消除了所有这些依赖关系。 它是一个纯.NET库,读取和写入.ods文件,无需Microsoft Office或任何COM注册。 您可通过 NuGet 安装它,并立即开始编写代码。

通过 NuGet 安装 IronXL

首先,创建一个新的Windows Forms App项目,目标为.NET 10。在Visual Studio中添加一个Button到表单表面。 将按钮命名为btnExport并赋予标签"导出到Excel"。 然后打开 NuGet 包管理器控制台并运行:

PM > Install-Package IronXL.Excel

请在表单文件顶部添加所需的命名空间:

using IronXL;
using System.Data;

这两个命名空间涵盖了您需要的所有IronXL类型,用于读取和写入Excel工作簿,以及标准的DataTable对象到导出管道的操作。

如何将示例数据加载到 DataGridView 控件中?

在构建导出逻辑之前,用代表性数据填充您的DataGridViewDataTable作为数据源的合适位置。 在实际应用中,您可以查询数据库或调用服务;这里,一个硬编码的DataTable清晰地展示了结构。 Microsoft Docs 上的 DataGridView 控件概述提供了有关该控件如何管理数据源的更多背景信息。

将 DataTable 绑定到 DataGridView

void Form1_Load(object sender, EventArgs e)
{
    DataTable dt = new DataTable();
    dt.Columns.Add("ProductID", typeof(int));
    dt.Columns.Add("ProductName", typeof(string));
    dt.Columns.Add("Price", typeof(decimal));
    dt.Columns.Add("Stock", typeof(int));

    dt.Rows.Add(1, "Laptop", 999.99m, 50);
    dt.Rows.Add(2, "Mouse", 29.99m, 200);
    dt.Rows.Add(3, "Keyboard", 79.99m, 150);
    dt.Rows.Add(4, "Monitor", 349.99m, 75);
    dt.Rows.Add(5, "Webcam", 89.99m, 120);

    dataGridView1.DataSource = dt;
}

此代码采用顶级语句风格定义事件处理程序的签名。 DataTable具有四种类型的列——整数、字符串、十进制和整数——在写入Excel工作簿时,IronXL将会保留这些类型。 数据列的类型至关重要,因为 IronXL 会将数值列写入为数值单元格而非文本单元格,这使得用户无需重新格式化即可在 Excel 中对值进行排序和求和。

C# DataGridView 导出到 Excel 并格式化:完整指南:图像2 - 表单的用户界面

DataTable列名称渲染列标题行。 导出时,您希望 Excel 文件中保留该标题行,这意味着您的导出代码必须将标题行与数据行分开处理——下一节将详细介绍这一点。

在生产使用中,无论DataTable来自Entity Framework、Dapper、ADO.NET或任何其他数据访问层,应用相同的模式。 DataGridView绑定与导出代码解耦,因此您可以更改数据源而无需修改导出逻辑。

如何将 DataGridView 中的数据导出到 Excel 文件?

核心导出逻辑在按钮点击处理程序中运行。 IronXL在LoadFromDataTable方法,可以自动处理列到单元格的映射。 最清洁的方法是从DataTable并直接传递。 Microsoft记录了Open XML SDK,该SDK是.xlsx格式的基础,并证明了像IronXL这样的纯.NET解决方案在程序生成方面比Interop表现更好。

按钮点击导出处理程序

void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        DataTable dt = new DataTable();

        foreach (DataGridViewColumn column in dataGridView1.Columns)
            dt.Columns.Add(column.HeaderText);

        foreach (DataGridViewRow row in dataGridView1.Rows)
        {
            if (row.IsNewRow) continue;

            DataRow dataRow = dt.NewRow();
            for (int i = 0; i < dataGridView1.Columns.Count; i++)
                dataRow[i] = row.Cells[i].Value ?? DBNull.Value;

            dt.Rows.Add(dataRow);
        }

        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.DefaultWorkSheet;
        worksheet.Name = "Product Data";

        worksheet.LoadFromDataTable(dt, true);

        string outputPath = Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
            "DataGridViewExport.xlsx"
        );

        workbook.SaveAs(outputPath);
        MessageBox.Show($"Exported successfully to:\n{outputPath}", "Export Complete",
            MessageBoxButtons.OK, MessageBoxIcon.Information);
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

C# DataGridView 导出到 Excel 并格式化:完整指南:图像3 - 生成的Excel文件

DataTable和一个布尔标志,告知IronXL将列名作为Excel的首行写入——这些将成为您的标题单元格。 工作簿使用Environment.SpecialFolder.Desktop保存到用户的桌面,而不是硬编码的路径,这使得代码可以在不同的用户帐户之间移植。

null检查 (?? DBNull.Value) prevents a NullReferenceException 当单元格不包含值时。 对于实际数据而言,这一点尤为重要,因为可选字段可能为空。 IronXL将DBNull写为空单元格,而不是字符串"DBNull",以保持输出的整洁。

关于将Excel文件中的数据读入DataGridView的更多信息,请参见IronXL DataTable documentation,其中涵盖了反向操作以及如何将Excel转换为DataSet用于多工作表工作簿。

如何对导出的 Excel 文件应用 Professional 格式?

Excel 文件中的原始数据虽能满足基本需求,但 Professional 排版的输出效果——如加粗标题、根据内容调整列宽、行背景色交替等——才是决定用户是否信任该工具的关键因素,否则用户往往会导出文件后立即手动重新排版。 IronXL 提供了一个功能丰富的单元格样式 API,涵盖字体、颜色、边框、数字格式和对齐方式。 OOXML 电子表格样式规范定义了 IronXL 写入的底层格式,确保您生成的文件可在任何符合该规范的应用程序中正确打开。

应用表头样式和交替行颜色

void ExportWithFormatting(object sender, EventArgs e)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;
    worksheet.Name = "Formatted Export";

    string[] headers = { "ID", "Product Name", "Price", "Stock" };

    // Write and style header row
    for (int col = 0; col < headers.Length; col++)
    {
        char colLetter = (char)('A' + col);
        string cellAddress = $"{colLetter}1";

        worksheet.SetCellValue(0, col, headers[col]);
        worksheet[cellAddress].Style.Font.Bold = true;
        worksheet[cellAddress].Style.Font.Height = 12;
        worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
        worksheet[cellAddress].Style.Font.Color = "#FFFFFF";
        worksheet[cellAddress].Style.HorizontalAlignment =
            IronXL.Styles.HorizontalAlignment.Center;
    }

    // Write data rows with alternating background colors
    int rowIndex = 1;
    foreach (DataGridViewRow row in dataGridView1.Rows)
    {
        if (row.IsNewRow) continue;

        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(rowIndex, col,
                row.Cells[col].Value?.ToString() ?? string.Empty);
        }

        if (rowIndex % 2 == 0)
        {
            string rangeAddress = $"A{rowIndex + 1}:D{rowIndex + 1}";
            worksheet[rangeAddress].Style.SetBackgroundColor("#D6DCE5");
        }

        rowIndex++;
    }

    // Format the Price column as currency
    worksheet["C2:C100"].Style.Format = "$#,##0.00";

    // Auto-fit column widths
    worksheet.AutoSizeColumn(0);
    worksheet.AutoSizeColumn(1);
    worksheet.AutoSizeColumn(2);
    worksheet.AutoSizeColumn(3);

    string outputPath = Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "FormattedExport.xlsx"
    );

    workbook.SaveAs(outputPath);
    MessageBox.Show("Formatted export complete.", "Done",
        MessageBoxButtons.OK, MessageBoxIcon.Information);
}

C# DataGridView 导出到 Excel 并格式化:完整指南:图像4 - 所生成的格式化Excel文件的输出

格式化代码采用了多种技术手段。 标题行使用蓝色背景 (#4472C4),白色文本,12点粗体和居中对齐——这是一种标准的商业电子表格样式。 数据行在每个偶数行之间交替使用白色和浅灰色 (#D6DCE5),这使用户更容易跨宽表阅读而不会迷失位置。 价格列使用Excel内置的货币格式 ($#,##0.00),因此值在电子表格中显示为带有美元符号和两位小数,而不改变底层数字数据。 AutoSizeColumn将每列适合其最长值以确保没有内容被截断。

您可以进一步扩展此模式,通过 单元格边框样式条件格式化数据验证规则。 对于必须符合企业模板的报告,您还可以设置页面布局和打印区域,使导出的文件无需调整即可直接打印。

您如何处理大型数据集和性能调优?

DataGridView绑定到成千上万行时,逐个单元格迭代会变得显著缓慢。 两项优化显著提升了性能。 首先,使用SetCellValue。 其次,如果您的数据源是DataGridView行提取值:

void ExportLargeDataset(DataTable sourceTable)
{
    WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
    WorkSheet worksheet = workbook.DefaultWorkSheet;

    // Direct DataTable load -- fastest path for large data
    worksheet.LoadFromDataTable(sourceTable, true);

    // Apply header styling after load
    int colCount = sourceTable.Columns.Count;
    for (int col = 0; col < colCount; col++)
    {
        char colLetter = (char)('A' + col);
        worksheet[$"{colLetter}1"].Style.Font.Bold = true;
        worksheet[$"{colLetter}1"].Style.SetBackgroundColor("#4472C4");
        worksheet[$"{colLetter}1"].Style.Font.Color = "#FFFFFF";
    }

    workbook.SaveAs(Path.Combine(
        Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
        "LargeExport.xlsx"
    ));
}

对于超过10,000行的数据集,在后台线程上运行导出保持UI响应。将导出逻辑包装在MessageBox.Show调用回调到UI线程。 IronXL对单独WorkBook实例的写操作是线程安全的,因此如果需要,您可以并发运行多个导出。

其他性能资源:

在 DataGridView 导出功能方面,IronXL 与 Microsoft Interop 相比如何?

许多开发者会从 Microsoft Excel Interop 入手,因为它随 Office 一起提供,无需额外安装任何软件包。 然而,互操作性在生产环境中会迅速显现出实际成本。 下表总结了主要区别:

IronXL 与 Microsoft Excel 互操作性在 DataGridView 导出功能上的对比
能力IronXLMicrosoft Interop
需要安装 Microsoft Excel
适用于服务器/云环境否(不被微软支持)
需要清理 COM 对象是 (Marshal.ReleaseComObject)
处理大型数据集时的性能快速(纯 .NET)慢(COM 序列化开销)
安装方法NuGetCOM 参考 / Office 安装
支持的 .NET 版本.NET 4.6.2 -- .NET 10仅限 .NET Framework(功能有限)
支持 XLSX、CSV、ODS 格式仅支持通过 Excel 打开 XLSX/XLS 文件

微软自身的文档警告称,出于稳定性和许可方面的考虑,不应在服务器或服务账户中使用 Office Interop。 IronXL 可在 Azure 应用服务、Windows 服务主机、Docker 容器以及任何无法运行 Excel 等桌面应用程序的无头环境中正常运行。

对于已经使用Interop的团队想要迁移,IronXL的API映射得足够接近,大多数WorkSheet操作可以直接转换。 《IronXL 迁移指南》涵盖了常见的 Interop 模式及其在 IronXL 中的对应实现。

下一步计划是什么?

使用IronXL将DataGridView数据导出到Excel只需要安装一个NuGet包和几行代码,即可替换脆弱的COM互操作方法,提供一个干净、可维护的解决方案,适用于任何部署环境。 本文涵盖的技术——基础导出、格式化输出、大数据集优化以及对比表——为您提供了在 Windows Forms 生产应用程序中部署此功能所需的一切。

从这里,探索这些相关功能:

立即开始 IronXL 免费试用,在您的项目中测试完整功能集;若您已准备好进行生产环境部署,请查看 IronXL 授权选项

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

...
阅读更多

相关文章

Key in blue circle

立即获取免费的 30 天试用版密钥

Your trial license will be sent to your email address

无任何限制。100% 解锁。无需信用卡。

bullet_checked无需信用卡或创建账户无任何限制。100% 解锁。无需信用卡。
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
预约您的免费现场演示
Booking Badge

深受全球数百万工程师信赖

Iron Software 的客户徽标
获取您的无义务咨询
填写下面的表格或通过sales@ironsoftware.com
您的资料将始终保密。
深受全球数百万工程师信赖
Iron Software 的客户徽标
立即获取您的免费30 天试用密钥
无需信用卡或创建账户