IRONSOFTWAREHOME
USING IRONXL

C# 将 DataGridView 导出到 Excel 并带列标题

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

如何在C#中将DataGridView导出为带列标题的Excel?

将 Windows Forms DataGridView 控件中的数据导出为 Excel 格式是一个常见的需求,但开发人员经常会遇到一个令人沮丧的问题:导出的文件缺少列标题。 当您需要将 DataGridView 导出到 Excel 并保留列标题时,解决方案必须能够可靠地保留所有数据和格式。 使用 Microsoft Office Interop 的传统方法可能速度慢、不稳定,并且需要在运行代码的每台计算机上安装 MS Excel。

IronXL可以完美地解决这个问题。 这是一个.NET Excel 库,可以读取、创建和写入 Excel 文件,而无需任何 Office 依赖项。 本教程将引导您完成一个完整的导出解决方案——只需几行代码即可处理列标题、数据类型、空单元格和用户友好的文件保存。

最后,您将拥有一个可用的 Windows Forms 按钮处理程序,该处理程序可以将 DataGridView 导出到 XLSX 文件,并保留所有列标题。

开始之前你需要准备什么

在编写任何代码之前,请确保以下事项已就绪:

  • Visual Studio 2022 或更高版本(任何版本) 已安装.NET 10 SDK
  • 一个面向.NET 10 的 Windows 窗体应用程序项目 -NuGet访问来安装IronXL

下面的例子使用顶级语句和现代 .NET 10 项目结构。

如何在.NET项目中安装库?

在 Visual Studio 中打开NuGet程序包管理器控制台,并运行以下任一命令。 该软件包已在NuGet Gallery上列出,面向.NET Standard 2.0 及更高版本,因此可与任何现代.NET项目配合使用。

PM > Install-Package IronXL.Excel

dotnet add package IronXL.Excel

安装完成后,请在表单文件顶部添加所需的命名空间:

using IronXL;
using System;
using System.Data;
using System.Windows.Forms;

这些导入功能可以访问IronXL 的 Excel 功能、数据表操作以及导出过程所需的 Windows 窗体控件。

如何使用示例数据设置 DataGridView?

首先在 Visual Studio 中创建一个 Windows 窗体应用程序。 通过设计器向主窗体添加一个名为btnExport的按钮。 然后在表单加载时填充表格:

using System;
using System.Data;
using System.Windows.Forms;

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();

        // Define columns -- these names become Excel headers
        dt.Columns.Add("Product ID", typeof(int));
        dt.Columns.Add("Product Name", typeof(string));
        dt.Columns.Add("Price", typeof(decimal));
        dt.Columns.Add("Stock Quantity", typeof(int));

        // Add sample rows
        dt.Rows.Add(1001, "Laptop", 999.99m, 15);
        dt.Rows.Add(1002, "Mouse", 29.99m, 50);
        dt.Rows.Add(1003, "Keyboard", 79.99m, 30);
        dt.Rows.Add(1004, "Monitor", 299.99m, 12);
        dt.Rows.Add(1005, "Headphones", 89.99m, 25);

        // Bind data to the grid
        dataGridView1.DataSource = dt;
    }
}

dt.Columns.Add(...)调用中定义的列名将成为导出Excel文件中的标题行。您可以在此处替换任何数据源——数据库查询结果、CSV导入或存储为DataTable的API响应都可以与稍后显示的导出代码相同地工作。 DataTable方法特别方便,因为DataGridView公开了一个IBindingList,这意味着相同的导出代码可以在每种绑定场景中通用而无需修改。

如果您的DataGridView是使用SqlDataAdapter从数据库填充的,则DataTable已包含类型化的列。 将这些类型化的值传递给ToString(),可以在Excel输出中保持数值列的数值,这对于任何下游报告或数据透视表使用都很重要。

这将创建一个包含所有数据的 DataGridView:

C#使用IronXL将DataGridView导出到Excel并带有列标题:图像1 - DataGridView中的示例数据

对于更高级的数据绑定场景,微软关于DataGridView 数据绑定的文档提供了更多示例。

如何在将 DataGridView 导出到 Excel 时保留列标题?

导出方法从每个DataGridView列的HeaderText属性读取列标题,并将它们写入工作表的第0行。 数据行从第 1 行开始。 将此方法绑定到btnExport单击事件:

private void btnExport_Click(object sender, EventArgs e)
{
    try
    {
        // Create a new Excel workbook in XLSX format
        WorkBook workbook = WorkBook.Create(ExcelFileFormat.XLSX);
        WorkSheet worksheet = workbook.CreateWorkSheet("Exported Data");

        // Write column headers to row 0
        for (int col = 0; col < dataGridView1.Columns.Count; col++)
        {
            worksheet.SetCellValue(0, col, dataGridView1.Columns[col].HeaderText);
        }

        // Write data rows starting at row 1
        for (int row = 0; row < dataGridView1.Rows.Count; row++)
        {
            // Skip the placeholder new-row at the bottom of the grid
            if (dataGridView1.AllowUserToAddRows && row == dataGridView1.Rows.Count - 1)
                continue;

            for (int col = 0; col < dataGridView1.Columns.Count; col++)
            {
                var cellValue = dataGridView1.Rows[row].Cells[col].Value;
                if (cellValue != null)
                {
                    worksheet.SetCellValue(row + 1, col, cellValue.ToString());
                }
            }
        }

        // Prompt the user to choose a save location
        using SaveFileDialog saveFileDialog = new SaveFileDialog
        {
            Filter = "Excel Files|*.xlsx",
            FileName = "DataGridView_Export.xlsx"
        };

        if (saveFileDialog.ShowDialog() == DialogResult.OK)
        {
            workbook.SaveAs(saveFileDialog.FileName);
            MessageBox.Show("Export completed successfully!", "Success",
                            MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Export failed: {ex.Message}", "Error",
                       MessageBoxButtons.OK, MessageBoxIcon.Error);
    }
}

分解导出步骤

该方法的每个步骤都有其特定目的:

  • WorkBook.Create :使用 XLSX 格式在内存中初始化一个新的 Excel 文件。 在调用SaveAs之前,没有文件会写入磁盘。
  • CreateWorkSheet :添加一个命名的工作表来保存导出的数据。 在 Excel 中,"导出数据"会显示为标签页名称。
  • 列标题循环:读取每列的dataGridView1.Columns[col].HeaderText并将其写入行索引0。这是保留标题的关键步骤。
  • 数据行循环:嵌套循环遍历每一行和列,使用row + 1作为Excel行索引,因此数据始终从标题行以下开始。 -空值检查:防止单元格不包含值时出现异常,这在实际数据中很常见。
  • SaveFileDialog :允许用户在运行时选择文件名和目标位置,而不是硬编码路径。

导出的文件如下所示:

C#使用IronXL将DataGridView导出到Excel并带有列标题:图像2 - 导出示例数据的输出Excel文件

导出过程中如何处理常见极端情况?

现实世界的数据很少像样本数据集那样干净。 以下是您最有可能遇到的情况以及应对方法。

空单元格

数据循环中的空检查(if (cellValue != null))可以处理空单元格而不会抛出异常。 在 Excel 输出中,空白单元格将保持空白,从而保留网格结构。

混合数据类型

IronXL可以自动处理不同的数据格式。 当您通过ToString()将数字作为字符串传递时,Excel可能仍会根据值将其识别为数值。 为了精确控制数据类型,请在写入之前将单元格值强制转换为正确的类型:

if (cellValue is int intVal)
    worksheet.SetCellValue(row + 1, col, intVal);
else if (cellValue is decimal decVal)
    worksheet.SetCellValue(row + 1, col, (double)decVal);
else
    worksheet.SetCellValue(row + 1, col, cellValue?.ToString() ?? string.Empty);

这种方法可以保持 Excel 中的数值列为数值型,以便后续的公式和排序功能能够正常工作。

标题中的特殊字符

具有特殊字符的列标题,例如&, <, >,以及重音字母可以正确导出。 IronXL会自动处理编码,无需您进行任何转义操作。

大型数据集

对于包含数万行的网格,可考虑将导出逻辑移动到后台线程以保持UI的响应。将Task.Run调用中,并从完成的回调中更新UI。 微软关于 使用 Task 进行异步编程的文档详细解释了这种模式。

对于单元格样式公式保留和密码保护等其他场景, IronXL文档对每一种场景都有详细介绍。

主要出口方式有何异同?

在决定使用某个库之前,了解最常用方法之间的优缺点会很有帮助。

C# 中 DataGridView 与 Excel 导出方法的比较
方法办公室要求列标题表现服务器安全
Microsoft Office Interop手册慢的
OpenXml SDK手册快速地
ClosedXML手册好的
IronXL自动翻译快速地

基于互操作性的解决方案需要在服务器上安装 Excel,这既是许可问题,也是部署复杂性问题。 OpenXml SDK 功能强大但底层——编写标题行需要手动构建 XML 结构。 IronXL和ClosedXML都提供高级别API,但IronXL的工作簿和工作表模型与开发人员已经对电子表格的思维方式更加一致。

如何导出为 CSV 而不是 XLSX?

如果您需要 CSV文件而不是Excel工作簿,则可以应用相同的导出模式。 更改文件格式和扩展名:

WorkBook csvWorkbook = WorkBook.Create(ExcelFileFormat.CSV);
WorkSheet csvSheet = csvWorkbook.CreateWorkSheet("Data");

// Headers and data loops remain identical

using SaveFileDialog dialog = new SaveFileDialog
{
    Filter = "CSV Files|*.csv",
    FileName = "DataGridView_Export.csv"
};

if (dialog.ShowDialog() == DialogResult.OK)
    csvWorkbook.SaveAs(dialog.FileName);

当使用系统不支持 XLSX 格式,或者对于非常大的数据集来说文件大小是一个问题时,CSV 导出非常有用。

如何在导出的文件中设置标题行的样式?

导出的数据如果标题行在视觉上清晰可见,则更易于阅读。 IronXL提供单元格样式选项,让您在写入标题值后应用粗体文本、背景色和字体大小:

// Write headers and apply bold styling
for (int col = 0; col < dataGridView1.Columns.Count; col++)
{
    string cellAddress = worksheet.GetCellAddress(0, col);
    worksheet[cellAddress].Value = dataGridView1.Columns[col].HeaderText;
    worksheet[cellAddress].Style.Font.Bold = true;
    worksheet[cellAddress].Style.SetBackgroundColor("#4472C4");
    worksheet[cellAddress].Style.Font.FontColor = "#FFFFFF";
}

带有样式的标题行使导出的文件可以直接用于报告,而无需收件人手动应用格式。 有关样式属性的完整列表,请参阅IronXL单元格样式参考

如何开始免费试用?

IronXL提供免费试用版,让您可以测试所有功能,包括本文中所示的导出工作流程。 使用上面显示的任一NuGet命令安装该软件包,在IronXL许可页面上生成试用密钥,并在首次调用库之前将其设置到您的应用程序中:

IronXL.License.LicenseKey = "YOUR-LICENSE-KEY-HERE";

该试用版会生成功能齐全的 Excel 文件,并且不会限制哪些功能可用。 对于生产部署,许可选项涵盖单个开发人员、团队和免版税再分发。

对于相关的导出场景,探索IronXL如何处理将DataTables直接导出为Excel将Excel文件读取到DataGridViews中,以及从导出数据中创建图表

为您的用例选择合适的出口策略

本教程中展示的逐单元格导出方法简单直接,适用于大多数 Windows Forms 应用程序。 如果您的DataGridView绑定到一个DataTable,您也可以将DataTable直接传递给IronXL的DataTable到工作表转换器,它会自动处理标题行。 如果列布局固定,并且您希望代码路径最短,请选择直接使用 DataTable 的方法。 当您需要对每个单元格应用条件逻辑时,请选择逐单元格手动操作的方法——例如,突出显示值超出可接受范围的单元格,或者在写入之前显式映射可空类型。

对于生成可下载 Excel 报表的服务器端场景(例如ASP.NET Core控制器),同样的IronXL API 也适用。 唯一的区别是保存目标:调用application/vnd.openxmlformats-officedocument.spreadsheetml.sheet内容类型将字节写入HTTP响应。 无论输出到文件还是流,列标题的传输方式都完全相同。

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 天试用密钥
无需信用卡或创建账户