使用JavaScript对比Excel文件遇报错,需跨文件对比指定列
JavaScript对比两个Excel文件指定列的实现与报错排查
依赖准备
首先安装Node.js环境下处理Excel的常用库xlsx:
npm install xlsx
完整实现代码
以下代码实现读取两个Excel文件的指定列,基于唯一标识列(如ID)进行行匹配,输出三类差异:A有B无、B有A无、指定列值不匹配。
const XLSX = require('xlsx'); const path = require('path'); // 读取Excel文件并提取指定列 function readTargetColumns(filePath, targetColumns) { // 用绝对路径避免相对路径问题 const absolutePath = path.resolve(__dirname, filePath); const workbook = XLSX.readFile(absolutePath); // 默认读取第一个工作表,如需指定工作表可修改这里 const sheetName = workbook.SheetNames[0]; const worksheet = workbook.Sheets[sheetName]; // 转换为JSON格式,保留原始数据类型 const jsonData = XLSX.utils.sheet_to_json(worksheet, { raw: true }); // 提取目标列,处理缺失列的情况 return jsonData.map(row => { const filtered = {}; targetColumns.forEach(col => { filtered[col] = row[col] ?? '[缺失值]'; }); return filtered; }).filter(row => // 过滤掉关键列缺失的行(这里假设第一个目标列为唯一标识) row[targetColumns[0]] !== '[缺失值]' ); } // 对比两组数据的指定列 function compareTargetData(dataA, dataB, keyCol) { const bMap = new Map(dataB.map(row => [row[keyCol], row])); const differences = []; // 遍历A,找B中没有的行或值不匹配的行 dataA.forEach(rowA => { const key = rowA[keyCol]; const rowB = bMap.get(key); if (!rowB) { differences.push({ type: '仅在第一个文件存在', 唯一标识: key, 数据: rowA }); return; } // 对比所有目标列的差异 const mismatchedCols = Object.keys(rowA).filter(col => rowA[col] !== rowB[col]); if (mismatchedCols.length > 0) { differences.push({ type: '列值不匹配', 唯一标识: key, 差异列: mismatchedCols, 第一个文件数据: rowA, 第二个文件数据: rowB }); } bMap.delete(key); }); // 遍历剩余的B,找A中没有的行 bMap.forEach((rowB, key) => { differences.push({ type: '仅在第二个文件存在', 唯一标识: key, 数据: rowB }); }); return differences; } // 主执行逻辑 try { // 配置参数:修改为你的文件路径和目标列 const config = { fileA: './fileA.xlsx', fileB: './fileB.xlsx', targetColumns: ['ID', '产品名称', '单价'], // 要对比的列 keyColumn: 'ID' // 用于匹配行的唯一标识列 }; const dataA = readTargetColumns(config.fileA, config.targetColumns); const dataB = readTargetColumns(config.fileB, config.targetColumns); const diffResult = compareTargetData(dataA, dataB, config.keyColumn); console.log('=== 对比结果 ==='); console.log(JSON.stringify(diffResult, null, 2)); } catch (err) { console.error('执行出错:', err.message); }
常见报错排查
Error: Cannot find module 'xlsx'
- 解决:确保已执行
npm install xlsx,如果是TypeScript项目,额外安装@types/xlsx。
- 解决:确保已执行
Error: File not found
- 解决:检查文件路径是否正确,建议使用绝对路径(代码中已通过
path.resolve处理),确认文件存在于指定位置。
- 解决:检查文件路径是否正确,建议使用绝对路径(代码中已通过
Cannot read properties of undefined (reading '[列名]')
- 解决:检查Excel文件中是否存在指定的列名,注意列名大小写敏感;代码中已处理缺失列的情况,若仍报错,可能是唯一标识列缺失,可调整过滤逻辑。
Invalid file format
- 解决:确保文件是有效的
.xlsx或.xls格式,避免将CSV文件重命名为Excel后缀;若文件损坏,重新打开Excel并保存。
- 解决:确保文件是有效的
大文件内存溢出
- 解决:改用流式读取API处理大文件,示例代码如下:
const stream = XLSX.stream.to_json(worksheet, { raw: true }); // 逐行处理数据,避免一次性加载全部内容
- 解决:改用流式读取API处理大文件,示例代码如下:
内容的提问来源于stack exchange,提问作者divya ranawat
相关产品推荐
相关产品推荐

