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

对比两个多工作表Excel文件差异并单独保存报错求解

Excel多工作表对比报错修复方案

报错信息

运行对比代码时抛出如下异常:

ValueError: not enough values to unpack (expected 2, got 1)

异常触发位置:rows, cols = np.where(comparison_values == False)

问题根因

  • 变量名冲突:原代码中df1最初是读取整个Excel得到的工作表字典,循环遍历工作表时又将单表DataFrame命名为df1,直接覆盖了外层字典对象
  • 语法缩进错误:comparison_values赋值行缩进量与上下文不匹配,不符合Python语法规则
  • 核心触发点:两个文件中同名工作表的行数、列数不一致,或者列顺序不匹配,导致数组对比后没有返回二维布尔矩阵,np.where仅返回1维结果,无法拆分为行、列两个索引数组
  • 缺失边界逻辑:没有处理单文件独有工作表、空值对比误判(np.nan == np.nan默认返回False)、列顺序不一致导致的错配问题

修复后完整代码

import pandas as pd
import numpy as np

# 读取两个Excel的所有工作表,变量名与后续单表对象做区分
all_sheets1 = pd.read_excel('test_1.xlsx', sheet_name=None, dtype=str)
all_sheets2 = pd.read_excel('test_2.xlsx', sheet_name=None, dtype=str)

with pd.ExcelWriter('./Excel_diff.xlsx') as writer:
    # 取两个文件所有工作表的并集,避免遗漏单文件独有的表
    all_sheet_names = set(all_sheets1.keys()).union(set(all_sheets2.keys()))
    for sheet in all_sheet_names:
        # 处理工作表仅在单个文件存在的情况
        if sheet not in all_sheets1:
            diff_df = pd.DataFrame({'差异说明': [f"工作表【{sheet}】仅存在于test_2.xlsx,test_1.xlsx无此表"]})
            diff_df.to_excel(writer, sheet_name=sheet, index=False)
            continue
        if sheet not in all_sheets2:
            diff_df = pd.DataFrame({'差异说明': [f"工作表【{sheet}】仅存在于test_1.xlsx,test_2.xlsx无此表"]})
            diff_df.to_excel(writer, sheet_name=sheet, index=False)
            continue
        
        # 统一填充空值,避免NaN==NaN返回False的误判问题
        df_a = all_sheets1[sheet].fillna('空值')
        df_b = all_sheets2[sheet].fillna('空值')
        
        # 自动对齐两个表的行和列,解决形状、列顺序不一致问题,缺失内容填充明确标记
        df_a_aligned, df_b_aligned = df_a.align(df_b, join='outer', axis=None, fill_value='对应位置无内容')
        
        # 逐单元格对比,得到二维布尔矩阵
        comparison_values = df_a_aligned.values == df_b_aligned.values
        rows, cols = np.where(comparison_values == False)
        
        # 差异单元格替换为「原文件值 → 对比文件值」格式
        for row, col in zip(rows, cols):
            old_val = df_a_aligned.iloc[row, col]
            new_val = df_b_aligned.iloc[row, col]
            df_a_aligned.iloc[row, col] = f'{old_val} → {new_val}'
        
        # 带差异标记的表写入结果文件
        df_a_aligned.to_excel(writer, sheet_name=sheet, index=False)

代码优化点

  • 修复了原代码变量名冲突、缩进错误的基础语法问题
  • 支持识别仅在单个Excel中存在的工作表,不会遗漏对比项
  • 读取时统一转为字符串类型、空值统一填充标记,避免数字/日期格式差异、空值导致的误判
  • 自动对齐两个工作表的行、列顺序,从根源解决行列数不一致导致的解包报错,缺失位置会明确标记「对应位置无内容」
  • 差异单元格直接展示值的变化,不需要手动交叉核对两个原文件

内容的提问来源于stack exchange,提问作者Varun Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:09:19