如何使用ExcelJS结合Node.js流为XLSX文件设置单元格样式?
如何在ExcelJS流式传输XLSX文件时设置单元格样式?
常规场景下,使用ExcelJS为XLSX文件设置格式和样式是可行的,示例代码如下:
const workbook = new ExcelJS.Workbook(); const worksheet = workbook.addWorksheet('My Sheet'); // 添加表头并设置样式 worksheet.addRow(["Column 1", "Column 2", "Column 3", "Column 4"]).eachCell((cell) => { cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '1a5896' }, }; cell.font = { bold: true, color: { argb: 'F8F9FA' } }; });
但在将文件流式传输到HTTP响应时,使用WorkbookWriter直接设置单元格样式不会生效,示例代码如下:
const workbook = new exceljs.stream.xlsx.WorkbookWriter({stream: response}); const worksheet = workbook.addWorksheet('My Sheet'); // 添加表头尝试设置样式(无效果) worksheet.addRow(["Column 1", "Column 2", "Column 3", "Column 4"]).eachCell((cell) => { cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: '1a5896' }, }; cell.font = { bold: true, color: { argb: 'F8F9FA' } }; });
请问如何在流式传输时修改XLSX文件的单元格样式?
解决方案:预定义样式并关联到单元格
WorkbookWriter采用流式写入机制,数据一旦写入流就无法修改,因此不能像普通Workbook那样直接修改已写入单元格的样式。正确做法是先预定义样式,再在写入单元格时关联样式引用。
步骤1:预定义样式
在创建工作表前,通过workbook.addStyle()定义需要的样式,该方法会返回一个可复用的样式ID:
const workbook = new exceljs.stream.xlsx.WorkbookWriter({stream: response}); // 定义表头样式 const headerStyle = workbook.addStyle({ fill: { type: 'pattern', pattern: 'solid', fgColor: { argb: '1a5896' } }, font: { bold: true, color: { argb: 'F8F9FA' } } });
步骤2:写入单元格时关联样式
添加行时,通过对象数组的形式指定每个单元格的值和对应的样式,而非事后修改:
const worksheet = workbook.addWorksheet('My Sheet'); // 添加带样式的表头 worksheet.addRow([ { value: "Column 1", style: headerStyle }, { value: "Column 2", style: headerStyle }, { value: "Column 3", style: headerStyle }, { value: "Column 4", style: headerStyle } ]);
步骤3:提交流式写入
必须调用commit()方法,确保样式定义和所有内容完整写入输出流:
await worksheet.commit(); await workbook.commit();
完整示例代码
const exceljs = require('exceljs'); async function streamExcel(response) { const workbook = new exceljs.stream.xlsx.WorkbookWriter({ stream: response }); // 定义表头样式 const headerStyle = workbook.addStyle({ fill: { type: 'pattern', pattern: 'solid', fgColor: { argb: '1a5896' } }, font: { bold: true, color: { argb: 'F8F9FA' } } }); const worksheet = workbook.addWorksheet('My Sheet'); // 添加带样式的表头 worksheet.addRow([ { value: "Column 1", style: headerStyle }, { value: "Column 2", style: headerStyle }, { value: "Column 3", style: headerStyle }, { value: "Column 4", style: headerStyle } ]); // 添加普通数据行 worksheet.addRow(["Data 1", "Data 2", "Data 3", "Data 4"]); // 提交完成写入 await worksheet.commit(); await workbook.commit(); }
关键说明
- 流式写入不可逆,所有样式必须在单元格写入前定义好并关联。
- 预定义的样式可以重复使用在多个单元格或行上,减少冗余。
- 若遗漏
commit()调用,样式和部分内容可能不会被写入输出流。
内容的提问来源于stack exchange,提问作者Calvin
相关产品推荐
相关产品推荐

