使用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)无法获取有效单元格数据
- exceljs解析CSV文件时,默认生成的工作表名称固定为
修复方法
- 移除错误的
createReadStream调用,exceljs的read方法本身支持直接接收Buffer类型输入,直接传入file.buffer即可完成内存中文件内容的解析,不需要落盘再读取。 - 修正工作表名称、行列索引的错误取值逻辑。
修复后的完整代码如下:
@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
相关产品推荐
相关产品推荐

