对比两个多工作表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
相关产品推荐
相关产品推荐

