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

使用excelJS与multer读取Excel文件报ENOENT错误如何解决

报错原因
  • 核心触发原因:fs.createReadStream 方法仅支持传入磁盘文件路径作为入参,你将multer解析到内存的二进制Bufferfile.buffer直接传入该方法时,底层会将Buffer强制转换为字符串作为文件路径去磁盘查找对应文件,自然找不到目标文件,抛出ENOENT: no such file or directory错误。
  • 代码还存在两个隐藏逻辑问题,修复流读取问题后仍会触发运行异常:
    • exceljs解析CSV文件时,默认生成的工作表名称固定为csv,并非xlsx格式默认的Sheet1,按Sheet1获取工作表会返回空值
    • exceljs的行、列索引均从1开始计数,不存在索引为0的行,调用getRow(0)无法获取有效单元格数据
修复方法
  1. 移除错误的createReadStream调用,exceljs的read方法本身支持直接接收Buffer类型输入,直接传入file.buffer即可完成内存中文件内容的解析,不需要落盘再读取。
  2. 修正工作表名称、行列索引的错误取值逻辑。

修复后的完整代码如下:

@Post('excel')
@UseInterceptors(FileInterceptor('excel'))
async uploadFile(@UploadedFile() file: Express.Multer.File) {
  const workBook = new Excel.Workbook();
  // 直接读取内存中的Buffer数据
  await workBook.csv.read(file.buffer).catch((err) => console.log('CSV解析异常:', err));

  // 匹配CSV解析后的默认工作表名
  const sheet = workBook.getWorksheet('csv');
  // 按从1开始的索引取第一行第一列的单元格值
  const cellValue = sheet.getRow(1).getCell(1).value;

  return cellValue;
}

补充说明:如果接口需要同时支持xlsx格式Excel文件解析,将workBook.csv.read替换为workBook.xlsx.read即可,xlsx格式解析后第一个工作表默认名称为Sheet1。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 09:54:29