C# 使用 NPOI 导出 Excel 并合并行列实现

沈亦白
沈亦白
发布时间:2026-10-16 | 4人浏览过
原创

介绍在 .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 开发的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表