概述
在业务系统中,经常需要根据预设的 Excel 模板填充数据生成报表。ExcelJS 是 Node.js 生态中功能完善的 Excel 操作库,支持读取模板、插入行、设置公式和单元格样式。
1. 读取模板文件
使用 readFile 加载现有 xlsx 模板,保留模板中的表头样式与合并单元格:
const ExcelJS = require('exceljs');
const workbook = new ExcelJS.Workbook();
await workbook.xlsx.readFile('template.xlsx');
2. 动态插入数据行
通过 insertRows 在指定位置插入空行,再逐行填充数据:
const startRow = 4;
worksheet.insertRows(startRow, Array(items.length).fill({}));
items.forEach((it, index) => {
const row = worksheet.getRow(startRow + index);
row.getCell(1).value = it.date;
row.getCell(2).value = it.tonnage;
// ...
});
3. 设置 Excel 公式
金额列可以使用公式让 Excel 自行计算,确保打开文件后结果准确。配合 ROUND 函数控制小数位数:
row.getCell('金额列').value = {
formula: `ROUND(吨位单元格*单价单元格, 4)`,
result: 预计算结果
};
4. 单元格格式与边框
明细行与合计行可以设置不同的小数显示格式。通过 numFmt 控制显示精度,通过 border 添加细边框:
// 明细:4位小数
cell.numFmt = '0.0000';
cell.border = { top: {style:'thin'}, left:{style:'thin'}, bottom:{style:'thin'}, right:{style:'thin'} };
// 合计:2位小数
summaryCell.numFmt = '0.00';
5. 输出 Buffer
生成完成后输出为 Buffer,可直接返回给前端下载或上传至云存储:
const buffer = await workbook.xlsx.writeBuffer({ useSharedStrings: true, useStyles: true });
小结
ExcelJS 的模板填充方案关键在于:保留模板原有样式、用公式保证计算准确、用 numFmt 控制显示精度。这样可以灵活应对各类报表生成需求。