如何用ExcelJS在JS中从含空单元格的Excel生成对象数组
解决ExcelJS读取Excel时空单元格丢失、属性不完整的问题
问题根源在于ExcelJS的row.eachCell()方法默认只会遍历有值或有样式的单元格,空单元格会被跳过,导致对应表头的属性根本不会被添加到rowData中,自然无法设置为空字符串。另外原代码判断第一列是否有值的逻辑也不够严谨,需要覆盖空字符串、null、undefined的情况。
修改后的完整代码
function handleSaveCSV() { if (files.accepted.length === 0) { console.log('No file selected.'); return; } const file = files.accepted[0]; const reader = new FileReader(); reader.onload = async (event) => { const data = new Uint8Array(event.target.result); const workbook = new ExcelJS.Workbook(); await workbook.xlsx.load(data); const worksheet = workbook.getWorksheet(1); const headerRow = worksheet.getRow(1); const headers = headerRow.values; // 获取表头总列数(ExcelJS列从1开始计数) const totalColumns = headerRow.cellCount; const dataArray = []; for (let i = 2; i <= worksheet.rowCount; i++) { const row = worksheet.getRow(i); const rowData = {}; // 遍历所有表头列,而非仅存在值的单元格 for (let colNumber = 1; colNumber <= totalColumns; colNumber++) { const header = headers[colNumber]; if (header) { const cell = row.getCell(colNumber); // 单元格无值时统一设为空字符串 rowData[header] = cell.value !== null && cell.value !== undefined ? cell.value : ''; } } // 严格判断第一列是否有有效内容(排除空、空白字符串) const firstColumnValue = rowData[headers[1]]; if (firstColumnValue !== null && firstColumnValue !== undefined && firstColumnValue.trim() !== '') { dataArray.push(rowData); } } console.log(dataArray); }; reader.readAsArrayBuffer(file); }
关键修改说明
- 用
headerRow.cellCount获取表头总列数,确保所有表头对应的列都被遍历 - 主动调用
row.getCell(colNumber)获取每一列的单元格,无论是否为空 - 初始化所有表头属性,空单元格对应值强制设为空字符串
- 优化第一列的筛选逻辑,仅保留有非空、非空白有效值的行
内容的提问来源于stack exchange,提问作者Avi4nFLu
相关产品推荐
相关产品推荐

