You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 11:17:22