如何遍历Excel工作簿所有工作表实现批量对比(无需硬编码索引)
Excel工作簿全工作表自动对比方案
需求说明
需要对比两个理应完全一致的Excel工作簿,定位内容差异。现有基于xlrd的代码仅支持单工作表对比,但工作簿的工作表数量不固定(两工作簿合计最多可达70个),要求无需硬编码工作表索引,实现自动遍历所有工作表完成对比。
原代码存在的问题:需手动修改sheet_by_index的索引值来切换对比的工作表,无法批量处理。
修改后的实现代码
from itertools import izip_longest import xlrd # 打开两个目标工作簿 wb1 = xlrd.open_workbook('file1.xlsx') wb2 = xlrd.open_workbook('file2.xlsx') # 获取两个工作簿的所有工作表名称集合,确保覆盖所有可能的表 wb1_sheet_names = set(wb1.sheet_names()) wb2_sheet_names = set(wb2.sheet_names()) all_sheet_names = wb1_sheet_names.union(wb2_sheet_names) # 遍历所有需要对比的工作表 for sheet_name in all_sheet_names: print(f"\n=== 正在对比工作表: {sheet_name} ===") # 尝试获取两个工作簿中的对应工作表,处理表缺失的情况 sheet1 = None try: sheet1 = wb1.sheet_by_name(sheet_name) except xlrd.XLRDError: print(f"工作簿file1.xlsx中不存在工作表: {sheet_name}") sheet2 = None try: sheet2 = wb2.sheet_by_name(sheet_name) except xlrd.XLRDError: print(f"工作簿file2.xlsx中不存在工作表: {sheet_name}") # 仅当两个表都存在时,执行内容对比 if sheet1 and sheet2: max_row_count = max(sheet1.nrows, sheet2.nrows) for rownum in range(max_row_count): # 获取当前行数据,处理行数量不一致的情况 row1 = sheet1.row_values(rownum) if rownum < sheet1.nrows else [] row2 = sheet2.row_values(rownum) if rownum < sheet2.nrows else [] if rownum >= sheet1.nrows: print(f"工作表{sheet_name} - 第{rownum+1}行: file1.xlsx缺失该行") if rownum >= sheet2.nrows: print(f"工作表{sheet_name} - 第{rownum+1}行: file2.xlsx缺失该行") # 逐列对比单元格内容 max_col_count = max(len(row1), len(row2)) for colnum in range(max_col_count): val1 = row1[colnum] if colnum < len(row1) else None val2 = row2[colnum] if colnum < len(row2) else None if val1 != val2: print(f"工作表{sheet_name} - 行{rownum+1} 列{colnum+1}: '{val1}' != '{val2}'")
核心改进说明
- 自动遍历所有工作表:通过获取两个工作簿的工作表名称集合,自动覆盖所有需要对比的表,彻底摆脱硬编码索引的限制。
- 处理工作表缺失场景:如果某个工作表仅存在于其中一个工作簿,会直接输出缺失提示,避免遗漏差异。
- 完善差异检测:不仅对比单元格内容不一致的情况,还会提示其中一个工作簿缺失的行,让差异定位更全面。
- 结果更易读:增加工作表名称的标识,让每一条差异信息都能直接对应到具体位置。
内容的提问来源于stack exchange,提问作者TheMonkfish
相关产品推荐
相关产品推荐

