You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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);
}

常见报错排查

  1. Error: Cannot find module 'xlsx'

    • 解决:确保已执行npm install xlsx,如果是TypeScript项目,额外安装@types/xlsx。
  2. Error: File not found

    • 解决:检查文件路径是否正确,建议使用绝对路径(代码中已通过path.resolve处理),确认文件存在于指定位置。
  3. Cannot read properties of undefined (reading '[列名]')

    • 解决:检查Excel文件中是否存在指定的列名,注意列名大小写敏感;代码中已处理缺失列的情况,若仍报错,可能是唯一标识列缺失,可调整过滤逻辑。
  4. Invalid file format

    • 解决:确保文件是有效的.xlsx或.xls格式,避免将CSV文件重命名为Excel后缀;若文件损坏,重新打开Excel并保存。
  5. 大文件内存溢出

    • 解决:改用流式读取API处理大文件,示例代码如下:
      const stream = XLSX.stream.to_json(worksheet, { raw: true });
      // 逐行处理数据,避免一次性加载全部内容
      

内容的提问来源于stack exchange,提问作者divya ranawat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 17:50:23