C# WinForms 使用 NPOI 将 DataGridView 导出为 Excel
在 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# 数据处理与文件操作的文章资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









