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

使用ExcelJS修改xlsx模板后下载异常:首单元格显示[Object object]且插入行丢失

解决ExcelJS修改模板后前端下载异常问题

问题根源

  1. 插入行方式错误:使用insertRow传入对象时,工作表未定义对应列的key映射,导致整个对象被当作单个单元格内容,显示[Object object]。
  2. 响应数据格式错误:服务端将二进制buffer包裹在JSON对象中返回,前端接收时二进制数据被序列化破坏,导致文件损坏,插入的行无法正常显示。

服务端代码修正

直接返回Excel二进制流,同时修正插入行的逻辑:

const GetReport = async (req: Request, res: Response, next: NextFunction) => {
  const fileURL = 'C:PATH-TO-FILE/src/templates/emptyTest.xlsx';
  const workbook = new ExcelJS.Workbook();
  await workbook.xlsx.readFile(fileURL);
  const worksheet = workbook.getWorksheet('Hoja 1');

  // 方案1:无预定义列时,直接传入值数组(推荐用于空白模板)
  worksheet.insertRow(1, [1, 'John Doe', new Date(1970, 1, 1)]);

  // 方案2:若模板有列标题,先定义列key与标题的映射
  // worksheet.columns = [
  //   { key: 'id', header: 'ID' },
  //   { key: 'name', header: 'Name' },
  //   { key: 'dob', header: 'Date of Birth' }
  // ];
  // worksheet.insertRow(1, { id: 1, name: 'John Doe', dob: new Date(1970, 1, 1) });

  // 设置正确的响应头,直接写入响应流
  res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
  res.setHeader('Content-Disposition', 'attachment; filename=Report.xlsx');
  
  return workbook.xlsx.write(res);
};

前端代码修正

请求时指定接收blob类型,避免数据序列化:

// 假设AdminService基于axios,需配置responseType为blob
AdminService.GetReport({
  responseType: 'blob'
}).then((res) => {
  saveAs(res.data, 'Report.xlsx');
}).catch((error) => console.log(error));

说明

  • 服务端不再将buffer包装进JSON,而是直接通过响应流返回Excel文件,确保二进制数据完整。
  • 前端通过responseType: 'blob'直接接收二进制数据,避免JSON序列化导致的文件损坏。
  • 插入行时,若模板无预定义列,使用值数组可直接将内容分配到对应单元格;若有列标题,需先定义列的key,才能通过对象正确映射到对应列。

内容的提问来源于stack exchange,提问作者alexgarciaalcuadrado

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 23:47:38