C# 使用 NPOI 导出 Excel 并合并行列实现
介绍在 .NET 环境中利用 NPOI 组件替代 COM 自动化方式导出 Excel 的方法。重点讲解如何创建工作簿与表格,配置字体与格式,并在数据填充过程中通过计算行数实现单元格的自动合并操作。
准备条件:引入 NPOI 依赖
NPOI 是一个开源的 C# 库,允许在不安装 Microsoft Office 的情况下读写 Excel 文件。使用前需安装以下核心 DLL 及依赖项:
NPOI.dll:核心功能库。NPOI.OOXML.dll:支持 Office Open XML (XLSX) 格式。NPOI.OpenXml4Net.dll:底层 XML 处理库。NPOI.OpenXmlFormats.dll:OOXML 格式定义库。ICSharpCode.SharpZipLib.dll:ZIP 压缩支持(部分版本需要)。
可通过 NuGet 包管理器直接搜索 NPOI 进行一键安装,这将自动处理版本兼容性。
第一步:初始化工作簿与工作表
首先创建一个继承自 IWorkbook 接口的对象,推荐使用 XSSFWorkbook 以兼容 .xlsx 格式。随后为其创建一个命名后的工作表。
XSSFWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet("商品表");
// 可选:隐藏指定列,例如内部编号列
// sheet.SetColumnHidden(cellIndex, true);
第二步:构建表头与基础样式
在工作表的第 0 行创建表头。在此阶段可以统一设置单元格的高度、文本换行以及字体加粗等通用样式。通过循环遍历 DataTable 的列名,将中文表头写入对应列。
IRow headerRow = sheet.CreateRow(0);
headerRow.HeightInPoints = 35;
for (int i = 0; i < dtSource.Columns.Count; i++) {
// 1. 设置列宽
if (dtSource.Columns[i].ColumnName == "XH") {
sheet.SetColumnWidth(i, 3000); // 序号列宽度
} else {
sheet.SetColumnWidth(i, 5000);
}
// 2. 创建单元格并填入名称
string headerName = dtSource.Columns[i].Caption;
ICell cell = headerRow.CreateCell(i);
cell.SetCellValue(headerName);
// 3. 设置表头样式
ICellStyle headStyle = workbook.CreateCellStyle();
headStyle.WrapText = true;
IFont font = workbook.CreateFont();
font.Boldweight = (short)FontBoldWeight.Bold;
headStyle.SetFont(font);
cell.CellStyle = headStyle;
}
第三步:填充数据并动态合并单元格

数据的填充通常从第 1 行开始(索引 1)。根据业务需求,当“序号”相同的连续行需要合并时,必须在数据填充完毕该组数据后执行合并操作。合并的核心方法是 AddMergedRegion,它需要传入一个 CellRangeAddress 对象,包含起始行、结束行、起始列和结束列。
在实际逻辑中,通常需要外层循环控制“组别”(如相同序号),内层循环填充每一行的具体数据。每处理完一组数据,便记录该行数范围进行合并。
int rowIndex = 1; // 数据行起始索引
foreach (DataRow row in dtSource.Rows) {
IRow dataRow = sheet.CreateRow(rowIndex);
// 填充单个单元格,强制设为文本格式防止科学计数法
for (int colIndex = 0; colIndex < dtSource.Columns.Count; colIndex++) {
ICell newCell = dataRow.CreateCell(colIndex);
ICellStyle textStyle = workbook.CreateCellStyle();
IDataFormat format = workbook.CreateDataFormat();
textStyle.DataFormat = format.GetFormat("@"); // @ 代表文本格式
newCell.CellStyle = textStyle;
newCell.SetCellValue(row[colIndex].ToString());
}
rowIndex++;
}
对于合并逻辑,假设前几行具有相同的关联标识,可以使用如下调用:
// 合并第 startRow 到 endRow 的第 3 列 (索引为2)
sheet.AddMergedRegion(new CellRangeAddress(startRow, endRow, 2, 2));
第四步:添加页脚与最终输出
在表格最底部创建最后一行,用于显示制表人或日期等信息。同样需要使用合并单元格将该文本横跨所有列。
IRow footerRow = sheet.CreateRow(rowIndex);
footerRow.HeightInPoints = 40;
ICell footerCell = footerRow.CreateCell(0);
footerCell.SetCellValue("制作人:张三");
// 假设总共4列,合并0到3列
sheet.AddMergedRegion(new CellRangeAddress(rowIndex, rowIndex, 0, 3));
完成所有操作后,将 Workbook 写入 MemoryStream 缓冲,再转化为 FileStream 写入磁盘文件:
using (var stream = new MemoryStream()) {
workbook.Write(stream);
byte[] buffer = stream.ToArray();
using (var fileStream = new FileStream(strFileName, FileMode.Create, FileAccess.Write)) {
fileStream.Write(buffer, 0, buffer.Length);
fileStream.Flush();
}
}
以上就是 C# 使用 NPOI 处理 Excel 导出的详细内容,更多关于 C# Excel 开发的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













