# 功能说明
# 1.单元格级对比:逐行逐列对比两个工作表的每个单元格
# 2.智能标记:
# •黄色标记内容不同的单元格
# •红色标记Sheet1独有的行
# •绿色标记Sheet2独有的行
# 3.差异说明:在最后一列添加详细的差异说明
# 4.行数处理:自动处理两个工作表行数不一致的情况
# 使用方法
# 1.确保已安装依赖库:pip install pandas openpyxl
# 2.运行脚本并输入Excel文件路径
# 3.查看生成的"差异结果"工作表
# 4.按回车键退出程序
# 功能说明
# 1.单元格级对比:逐行逐列对比两个工作表的每个单元格
# 2.智能标记:
# •黄色标记内容不同的单元格
# •红色标记Sheet1独有的行
# •绿色标记Sheet2独有的行
# 3.差异说明:在最后一列添加详细的差异说明
# 4.行数处理:自动处理两个工作表行数不一致的情况
# 使用方法
# 1.确保已安装依赖库:pip install pandas openpyxl
# 2.运行脚本并输入Excel文件路径
# 3.查看生成的"差异结果"工作表
# 4.按回车键退出程序
import pandas as pd
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
def compare_sheets(file_path):
"""对比Excel文件中第一个和第二个工作表,标记单元格级差异"""
# 读取两个工作表
df1 = pd.read_excel(file_path, sheet_name=0) # 第一个sheet
df2 = pd.read_excel(file_path, sheet_name=1) # 第二个sheet
# 检查列名是否一致
# if list(df1.columns) != list(df2.columns):
# print("错误:两个工作表的列名不一致")
# return
# 创建新工作簿保存结果
wb = load_workbook(file_path)
if '差异结果' in wb.sheetnames:
del wb['差异结果']
ws = wb.create_sheet('差异结果')
# 设置颜色
red = PatternFill(start_color='FFC7CE', fill_type='solid') # 浅红色
green = PatternFill(start_color='C6EFCE', fill_type='solid') # 浅绿色
yellow = PatternFill(start_color='FFEB9C', fill_type='solid') # 黄色
# 写入表头
headers = list(df1.columns) + ['差异说明']
for col_num, header in enumerate(headers, 1):
ws.cell(row=1, column=col_num, value=header)
# 对比每一行
row_num = 2
for idx, (row1, row2) in enumerate(zip(df1.itertuples(index=False), df2.itertuples(index=False)), 1):
row_diff = False
notes = []
# 对比每个单元格
for col_idx, (val1, val2) in enumerate(zip(row1, row2), 1):
cell = ws.cell(row=row_num, column=col_idx, value=val1)
if pd.isna(val1) and pd.isna(val2):
continue
if val1 != val2:
row_diff = True
cell.fill = yellow # 标记差异单元格
notes.append(f"列{col_idx}: {val1}→{val2}")
if row_diff:
# 写入差异说明
ws.cell(row=row_num, column=len(headers), value="; ".join(notes))
row_num += 1
# 处理行数不一致的情况
len_diff = len(df1) - len(df2)
if len_diff > 0:
for idx in range(len(df2), len(df1)):
row = df1.iloc[idx]
for col_idx, val in enumerate(row, 1):
ws.cell(row=row_num, column=col_idx, value=val).fill = red
ws.cell(row=row_num, column=len(headers), value="Sheet1独有行")
row_num += 1
elif len_diff < 0:
for idx in range(len(df1), len(df2)):
row = df2.iloc[idx]
for col_idx, val in enumerate(row, 1):
ws.cell(row=row_num, column=col_idx, value=val).fill = green
ws.cell(row=row_num, column=len(headers), value="Sheet2独有行")
row_num += 1
# 保存结果
wb.save(file_path)
print(f"差异结果已保存到'差异结果'工作表")
if __name__ == "__main__":
file = input("请输入Excel文件路径: ")
compare_sheets(file)
input("对比完成,按回车键退出...")