C# WinForms 使用 NPOI 将 DataGridView 导出为 Excel

慢慢来
慢慢来
发布时间:2026-10-14| 6人浏览过
原创

在 C# WinForms 开发中,经常需要将界面展示的表格数据(DataGridView)导出为 Excel 文件以便于归档或分享。本文将详细讲解如何利用开源组件 NPOI(具体为 HSSFWorkbook 类),在不依赖 Microsoft Office 环境的情况下,将 DataGridView 中的数据逐行写入标准的 .xls 二进制格式文件中。

准备条件

要在项目中实现此功能,首先需要确保已引入 NPOI 相关的 DLL 文件。通常需要在项目中新建一个 lib 文件夹来存放这些引用库,并在项目的“引用”中添加对以下核心 DLL 的依赖:

  • NPOI.dll:核心库,用于处理 Office 文件格式。
  • NPOI.OOXML.dll / NPOI.OpenXml4Net.dll 等:NPOI 运行时所需的辅助库。

此外,代码中需要使用 System.Windows.Forms 中的 SaveFileDialog 来控制文件保存路径。

导出操作顺序

第1步:初始化保存对话框

目的是让用户指定导出文件的名称和位置。创建一个 SaveFileDialog 实例,设置过滤器仅允许选择 .xls 格式,并检查用户是否点击了确认按钮。

private void btnExportList_Click(object sender, EventArgs e)
{
    string fname = string.Empty;
    SaveFileDialog sfd = new SaveFileDialog();
    sfd.Filter = "表格文件|*.xls";
    sfd.DefaultExt = "xls";

    if (sfd.ShowDialog() == DialogResult.OK)
    {
        fname = sfd.FileName;
    }
    else
    {
        return; // 用户取消操作
    }
}

第2步:创建工作簿与工作表

在内存中实例化 HSSFWorkbook 对象代表整个 Excel 文件,并使用 CreateSheet 方法创建第一个工作表(例如命名为“第一页”)。这是 NPOI 处理旧版二进制格式(.xls)的标准方式。

// 3. 在内存中建立 excel表文件
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.CreateSheet("第一页");

第3步:创建标题行

在 Excel 的第0行插入表头信息。根据实际业务需求,动态或静态地填充列名。本例中预设了包括编号、姓名、地址等在内的7个字段。

// 创建标题头
HSSFRow title = sheet.CreateRow(0);
title.CreateCell(0).SetCellValue("编号");
title.CreateCell(1).SetCellValue("姓名");
title.CreateCell(2).SetCellValue("性别");
title.CreateCell(3).SetCellValue("年龄");
title.CreateCell(4).SetCellValue("地址");
title.CreateCell(5).SetCellValue("电话");
title.CreateCell(6).SetCellValue("生日");

第4步:遍历 DataGridView 数据并写入单元格

这是核心逻辑部分。通过双层循环遍历 dgvStudens 的每一行和每一列。在循环内部,需要特别注意处理 null 值,避免程序抛出异常。如果单元格值为 null,则直接传入 null;否则转换为字符串。

for (int rowindex = 0; rowindex < dgvStudens.RowCount; rowindex++)
{
    // 创建对应的工作表行(从第1行开始,因为第0行是标题)
    HSSFRow row = sheet.CreateRow(rowindex + 1);

    for (int colindex = 0; colindex < dgvStudens.Rows[rowindex].Cells.Count; colindex++)
    {
        // 安全获取单元格值:防止 null 引用异常
        object cellValue = dgvStudens.Rows[rowindex].Cells[colindex].Value;
        string valueStr = (cellValue == null) ? null : cellValue.ToString();
        
        row.CreateCell(colindex).SetCellValue(valueStr);
    }
}

第5步:将内存数据写入磁盘文件

使用 FileStream 打开用户选定的文件路径,并通过 workbook.Write() 方法将整个数据结构序列化写入文件。务必使用 using 语句确保流被关闭,防止文件占用或内存泄漏。

using (FileStream fs = new FileStream(fname, FileMode.Create))
{
    workbook.Write(fs);
}

完成判断与注意事项

当 workbook.Write(fs) 执行完毕且文件句柄正确释放后,即可在指定路径下找到生成的 .xls 文件。打开该文件,应能看到包含表头和所有网格数据的内容。

  • 性能提示:对于拥有数万行的大数据量导出,上述逐行创建的写法可能会消耗较多内存。若遇到性能瓶颈,可考虑先关闭 AUTO_SIZE_COLUMNS 或分批处理,但对于常规几千行的数据,此方法完全胜任。
  • 格式限制:本示例生成的是 .xls 格式(Excel 97-2003)。如果需要导出 .xlsx 格式,需改用 XSSFWorkbook 和 XSSFSheet 类。

简要总结

通过集成 NPOI 库并利用 HSSFWorkbook API,我们可以轻松地在 C# WinForms 环境中实现无 Office 依赖的数据导出功能。关键在于正确处理空值和确保资源释放。以上就是 C# WinForms 使用 NPOI 将 DataGridView 导出为 Excel 的详细内容,更多关于 C# 数据处理与文件操作的文章资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。