Node.js使用SheetJS读取XLSX文件异常问题求助
解决SheetJS读取XLSX时包含空行空列的问题
你的问题本质是SheetJS默认会读取工作表的全部已使用区域——而业务文件里的空行空列可能是格式残留(比如设置了单元格样式但无内容),被识别为已使用区域,导致导出的CSV混入大量无效空行。
下面提供两种实用解决方案,按需选择:
方案一:过滤空行后转CSV(简单易读,适合中小文件)
先把工作表转成数组格式,过滤掉全空的行,再转回CSV:
const XLSX = require('xlsx'); const workbook = XLSX.readFile('example.xlsx'); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; // 将工作表转为二维数组,header:1表示以数组形式返回每行数据 const rows = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); // 过滤掉全空的行(只要有一个非空单元格就保留) const filteredRows = rows.filter(row => row.some(cell => cell != null && cell !== '')); // 将过滤后的数组转回工作表,再转CSV const cleanedSheet = XLSX.utils.aoa_to_sheet(filteredRows); const csvData = XLSX.utils.sheet_to_csv(cleanedSheet); console.log(csvData);
方案二:调整工作表有效范围(高效,适合大文件)
直接修改工作表的!ref属性,缩小到真实有数据的区域,避免加载无效数据:
const XLSX = require('xlsx'); const workbook = XLSX.readFile('example.xlsx'); const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; // 解析当前工作表的范围 const range = XLSX.utils.decode_range(worksheet['!ref']); // 从下往上找最后一行有数据的行 for (let r = range.e.r; r >= range.s.r; r--) { let hasData = false; for (let c = range.s.c; c <= range.e.c; c++) { const cell = worksheet[XLSX.utils.encode_cell({ r, c })]; if (cell) { hasData = true; break; } } if (hasData) { range.e.r = r; break; } } // 从右往左找最后一列有数据的列 for (let c = range.e.c; c >= range.s.c; c--) { let hasData = false; for (let r = range.s.r; r <= range.e.r; r++) { const cell = worksheet[XLSX.utils.encode_cell({ r, c })]; if (cell) { hasData = true; break; } } if (hasData) { range.e.c = c; break; } } // 重新设置工作表的有效范围 worksheet['!ref'] = XLSX.utils.encode_range(range); // 转成CSV const csvData = XLSX.utils.sheet_to_csv(worksheet); console.log(csvData);
额外小技巧:快速去掉空行
如果只是单纯想去掉完全空的行,可以直接给sheet_to_csv加blankrows: false参数,但这个只能处理完全空的行,对有格式残留的半空行无效:
const csvData = XLSX.utils.sheet_to_csv(worksheet, { blankrows: false });
内容的提问来源于stack exchange,提问作者RustySpoon
相关产品推荐
相关产品推荐

