使用ExcelJS修改xlsx模板后下载异常:首单元格显示[Object object]且插入行丢失
解决ExcelJS修改模板后前端下载异常问题
问题根源
- 插入行方式错误:使用
insertRow传入对象时,工作表未定义对应列的key映射,导致整个对象被当作单个单元格内容,显示[Object object]。 - 响应数据格式错误:服务端将二进制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
相关产品推荐
相关产品推荐

