使用npm的XLSX包读取103MB Excel文件无响应,求解决方法
解决XLSX包读取大Excel文件无响应的问题
替换同步文件读取为异步方式
同步读取fs.readFileSync会阻塞Node.js事件循环,大文件加载时会导致程序长时间无响应。改用异步读取:const fs = require('fs/promises'); async function readExcel() { try { const buff = await fs.readFile(fileLocation); const workbook = XLSX.read(buff, options); // 后续处理逻辑 } catch (err) { console.error('读取或解析出错:', err); } } readExcel();修正日期格式配置错误
你的dateNF格式字符串存在问题:"dd/mmmm/yyyy hh:ss:MMMM"里的MMMM(月份全称)放在时分秒位置完全无效,会导致解析逻辑异常。改为合理的日期时间格式,同时注意raw: true会跳过格式转换,和cellDates: true冲突,需按需调整:const options: XLSX.ParsingOptions = { cellDates: true, dateNF: "dd/mmmm/yyyy hh:mm:ss", raw: false };使用流式解析处理大文件
100MB级别的文件一次性加载到内存会占用大量资源,甚至触发内存溢出。改用XLSX的流式API逐段处理:const { createReadStream } = require('fs'); const { stream } = require('xlsx'); const fileStream = createReadStream(fileLocation); const workbookReader = stream.read(fileStream, { cellDates: true, dateNF: "dd/mmmm/yyyy hh:mm:ss" }); workbookReader.on('worksheet', (ws) => { ws.on('row', (row) => { // 逐行处理数据 console.log(row); }); ws.on('end', () => { console.log('当前工作表处理完成'); }); }); workbookReader.on('error', (err) => { console.error('流式解析出错:', err); }); workbookReader.on('end', () => { console.log('整个文件解析完成'); });添加错误捕获机制
原代码没有错误捕获逻辑,即使发生错误也无法察觉。同步代码用try/catch包裹,异步代码通过catch捕获异常:try { const buff = fs.readFileSync(fileLocation); const workbook = XLSX.read(buff, options); // 后续处理 } catch (err) { console.error('操作失败:', err); }增加Node.js内存限制
大文件解析需要更多内存,启动Node.js时手动调整内存上限:node --max-old-space-size=4096 your-script.js这里设置为4GB,可根据实际硬件情况调整数值。
内容的提问来源于stack exchange,提问作者sevila
相关产品推荐
相关产品推荐

