使用XLSX库写入Excel文件时触发cannot save file报错
问题
我编写了一个函数,用于读取Excel工作簿、添加数据后保存文件。目前读取和添加数据的操作均正常,但尝试任何保存方法时都会报错。
代码如下:
import * as XLSX from 'xlsx/xlsx.mjs'; import * as fs from 'fs'; const xlsxFilePath = 'file.xlsx' export function addReportToExcel(start, ID, viewID, title, description, attachements, submissionDate) { const workbook = XLSX.read(fs.readFileSync(xlsxFilePath)); const worksheet = workbook.Sheets['Bugs']; const rowNumber = ID + 3; // 表头占用多行,此处做偏移处理 XLSX.utils.sheet_add_aoa(worksheet, [ [viewID], [title], [description], [attachements], [submissionDate], ['Reviewing'], [submissionDate], ['-'], ['-'] ], { origin: {c: start, r: rowNumber}}); XLSX.writeFile(workbook, xlsxFilePath); };
报错信息:
/node_modules/xlsx/xlsx.mjs:3220 throw new Error("cannot save file " + fname); ^ Error: cannot save file book.xlsx at write_dl (/node_modules/xlsx/xlsx.mjs:3220:8) at write_zip_denouement (/node_modules/xlsx/xlsx.mjs:23898:31) at write_zip_type (/node_modules/xlsx/xlsx.mjs:23868:9) at writeSync (/node_modules/xlsx/xlsx.mjs:24005:22) at Module.writeFileSync (/node_modules/xlsx/xlsx.mjs:24028:9) at addReportToExcel (/src/common.js:60:14) at test.js:3:1 at ModuleJob.run (node:internal/modules/esm/module_job:194:25)
解决方法
核对文件路径与权限:
- 注意到报错中显示要保存的是
book.xlsx,但代码里定义的路径是file.xlsx,先确认文件名是否一致,排查拼写错误。 - 检查目标文件所在目录的写入权限,Linux/macOS系统可通过
chmod +w 目标目录赋予写入权限,Windows系统需确保当前用户有修改该文件的权限。
- 注意到报错中显示要保存的是
替换为Node.js适配的写入方式:
XLSX.writeFile是为浏览器环境设计的API,在Node.js中建议结合fs模块手动处理Buffer:
将原代码中的XLSX.writeFile(workbook, xlsxFilePath);替换为:// 生成Excel文件的Buffer const excelBuffer = XLSX.write(workbook, { type: 'buffer', bookType: 'xlsx' }); // 用fs模块写入文件 fs.writeFileSync(xlsxFilePath, excelBuffer);排查文件占用情况:
确认目标Excel文件未被其他程序(如Excel客户端、其他后台进程)打开,文件被占用会导致写入失败。
内容的提问来源于stack exchange,提问作者coopchap
相关产品推荐
相关产品推荐

