NPOI 操作 Excel 完整指南
NPOI 是一个强大的 .NET 开源库,用于在没有安装 Microsoft Office 的情况下读写 Excel (.xls 和 .xlsx) 文件,它通过实现 POI (Java) 的功能,成为了 .NET 平台处理 Office 文档的主流选择。
核心概念与版本区分
在开始操作前,需要了解 NPOI 处理两种不同格式 Excel 的类:
- HSSFWorkbook: 用于处理旧版本的 Excel 格式 ( .xls ),基于 BIFF8 格式。
- XSSFWorkbook: 用于处理新版本的 Excel 格式 ( .xlsx ),基于 OOXML 格式。
- IWorkbook: 它是上述两个类的接口,建议在编写代码时使用接口,以提高代码的通用性。
层级结构:IWorkbook (工作簿) $rightarrow$ ISheet (工作表) $rightarrow$ IRow (行) $rightarrow$ ICell (单元格)
环境搭建
通过 NuGet 包管理器安装 NPOI:
Install-Package NPOI
写入 Excel 文件
写入文件的核心流程是:创建工作簿 $rightarrow$ 创建工作表 $rightarrow$ 创建行 $rightarrow$ 创建单元格 $rightarrow$ 写入值 $rightarrow$ 保存文件。
基础写入示例 (.xlsx)
using NPOI.XSSF.UserModel;
using NPOI.SS.UserModel;
using System.IO;
// 1. 创建工作簿
IWorkbook workbook = new XSSFWorkbook();
// 2. 创建工作表
ISheet sheet = workbook.CreateSheet("员工信息");
// 3. 创建第一行(表头)
IRow headerRow = sheet.CreateRow(0);
headerRow.CreateCell(0).SetCellValue("姓名");
headerRow.CreateCell(1).SetCellValue("年龄");
headerRow.CreateCell(2).SetCellValue("部门");
// 4. 写入数据行
IRow dataRow = sheet.CreateRow(1);
dataRow.CreateCell(0).SetCellValue("张三");
dataRow.CreateCell(1).SetCellValue(25);
dataRow.CreateCell(2).SetCellValue("技术部");
// 5. 将工作簿写入文件流
using (FileStream fs = new FileStream("Employee.xlsx", FileMode.Create, FileAccess.Write))
{
workbook.Write(fs);
}
读取 Excel 文件
读取文件的核心流程是:打开文件流 $rightarrow$ 加载工作簿 $rightarrow$ 获取工作表 $rightarrow$ 遍历行和单元格。
基础读取示例
using NPOI.SS.UserModel;
using System.IO;
using (FileStream fs = new FileStream("Employee.xlsx", FileMode.Open, FileAccess.Read))
{
// 使用 WorkbookFactory 自动识别 .xls 或 .x
lsx
IWorkbook workbook = WorkbookFactory.Create(fs);
ISheet sheet = workbook.GetSheetAt(0); // 获取第一个工作表
// 遍历所有行
for (int i = 0; i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
if (row == null) continue; // 跳过空行
// 遍历所有单元格
for (int j = 0; j < row.LastCellNum; j++)
{
ICell cell = row.GetCell(j);
if (cell != null)
{
Console.Write(cell.ToString() + "t");
}
}
Console.WriteLine();
}
}
进阶操作
1 设置单元格样式
样式需要通过 IWorkbook.CreateCellStyle() 创建,注意:不要在循环中频繁创建样式,否则会导致 Excel 文件损坏(样式数量有限制)。
ICellStyle style = workbook.CreateCellStyle(); IFont font = workbook.CreateFont(); font.IsBold = true; // 加粗 font.Color = IndexedColors.Blue.Index; // 蓝色 style.SetFont(font); style.Alignment = HorizontalAlignment.Center; // 居中 ICell cell = sheet.GetRow(0).GetCell(0); cell.CellStyle = style;
2 合并单元格
使用 sheet.AddMergedRegion 方法。
// 合并第一行第0列到第2列 (行索引, 行索引, 列索引, 列索引) sheet.AddMergedRegion(new NPOI.SS.Util.CellRangeAddress(0, 0, 0, 2));
3 写入公式
使用 SetCellFormula 方法。
IRow row = sheet.CreateRow(2);
row.CreateCell(0).SetCellValue(100);
row.CreateCell(1).SetCellValue(200);
// 在第三个单元格写入求和公式 A3+B3
row.CreateCell(2).SetCellFormula("SUM(A3:B3)");
核心注意事项与性能优化
- 内存管理:对于超大型 Excel 文件,
XSSFWorkbook会消耗大量内存,如果需要写入海量数据,建议研究SXSSFWorkbook(流式写入,仅限 Java 版 POI,.NET NPOI 在处理极大文件时需谨慎控制内存)。 - 空值处理:在读取时,
GetRow()和GetCell()可能会返回null,必须进行非空判断,否则会抛出NullReferenceException。 - 资源释放:务必将
FileStream放在using块中,确保文件在操作完成后被正确关闭。 - 数据类型:
ICell有多种类型(Numeric, String, Boolean, Formula),在读取时建议使用cell.CellType进行判断,以获取最准确的数据。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/493266.html



