Excel 两个sheet比较差异代码

# 功能说明

# 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("对比完成,按回车键退出...")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值