Excel数据对比:Python自动化实战技巧

2 阅读3分钟

经常需要对比两个Excel表格的差异。无论是财务对账、库存盘点还是数据迁移,快速准确地找出数据差异都能节省大量时间。今天分享用Python实现Excel数据对比的实用方案。

核心思路与准备工作

对比Excel数据的关键在于选择合适的比对维度。通常我们会基于唯一标识列(如订单号、产品ID)进行关联比对,然后检查其他字段的差异。

首先安装必要的库:

bash

pip install pandas openpyxl

基于Pandas的智能对比方案

以下是一个完整的双表对比实现:

python

import pandas as pd
from datetime import datetime

def compare_excel_sheets(file1, file2, key_columns, compare_columns):
    """
    智能对比两个Excel文件
    :param file1: 第一个文件路径
    :param file2: 第二个文件路径  
    :param key_columns: 关键列列表,用于匹配行
    :param compare_columns: 需要对比的列列表
    """
    
    # 读取Excel文件
    df1 = pd.read_excel(file1)
    df2 = pd.read_excel(file2)
    
    # 设置索引以便比较
    df1_set = df1.set_index(key_columns)
    df2_set = df2.set_index(key_columns)
    
    # 找出所有差异
    differences = []
    
    # 检查新增和删除的行
    common_keys = df1_set.index.intersection(df2_set.index)
    only_in_df1 = df1_set.index.difference(df2_set.index)
    only_in_df2 = df2_set.index.difference(df1_set.index)
    
    # 记录增删情况
    for key in only_in_df1:
        differences.append({
            '类型': '删除行',
            '关键值': key,
            '详情': '存在于第一个文件但第二个文件缺失'
        })
    
    for key in only_in_df2:
        differences.append({
            '类型': '新增行', 
            '关键值': key,
            '详情': '存在于第二个文件但第一个文件缺失'
        })
    
    # 对比共同行的字段差异
    for key in common_keys:
        row1 = df1_set.loc[key]
        row2 = df2_set.loc[key]
        
        for col in compare_columns:
            val1 = row1[col]
            val2 = row2[col]
            
            # 处理NaN值和正常值的比较
            if pd.isna(val1) and pd.isna(val2):
                continue
            elif pd.isna(val1) or pd.isna(val2) or val1 != val2:
                differences.append({
                    '类型': '数据变更',
                    '关键值': key,
                    '字段': col,
                    '文件1值': val1,
                    '文件2值': val2
                })
    
    # 生成对比报告
    report_df = pd.DataFrame(differences)
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    report_file = f"对比报告_{timestamp}.xlsx"
    
    with pd.ExcelWriter(report_file) as writer:
        report_df.to_excel(writer, sheet_name='差异详情', index=False)
        
        # 添加统计信息
        stats = {
            '对比时间': [timestamp],
            '总差异数': [len(differences)],
            '新增行数': [len(only_in_df2)],
            '删除行数': [len(only_in_df1)],
            '数据变更数': [len(differences) - len(only_in_df1) - len(only_in_df2)]
        }
        pd.DataFrame(stats).to_excel(writer, sheet_name='统计摘要', index=False)
    
    return report_file

# 使用示例
if __name__ == "__main__":
    result_file = compare_excel_sheets(
        file1='销售数据_月初.xlsx',
        file2='销售数据_月末.xlsx',
        key_columns=['订单编号'],  # 基于订单号进行匹配
        compare_columns=['客户名称', '产品数量', '订单金额', '发货状态']
    )
    
    print(f"对比完成,报告已保存至: {result_file}")

关键优势:这种方法不仅能找出数据值的差异,还能识别行的新增和删除,并提供详细的变更记录。

处理大型文件的优化技巧

当处理大型Excel文件时,需要考虑内存优化:

python

def memory_efficient_compare(file1, file2, key_column):
    """分块读取对比,节省内存"""
    chunksize = 10000
    results = []
    
    for chunk1 in pd.read_excel(file1, chunksize=chunksize):
        for chunk2 in pd.read_excel(file2, chunksize=chunksize):
            # 实现分块对比逻辑
            merged = pd.merge(chunk1, chunk2, on=key_column, how='outer', indicator=True)
            differences = merged[merged['_merge'] != 'both']
            results.append(differences)
    
    return pd.concat(results)

对于需要快速对比两个excel表中的不同但又不想写代码的场景,推荐使用专业工具如www.nimail.cn/dev-tool/ex…,这类工具通常提供可视化界面和更强大的对比功能。

实际项目中,建议先将对比逻辑封装成可重用的函数,然后根据具体业务需求进行调整。比如财务系统可能需要特别关注金额字段的精度,而库存系统可能需要关注数量的变化趋势。

通过Python实现Excel数据对比,不仅能够自定义对比规则,还能将对比过程集成到自动化流程中,大幅提升数据处理效率。记得在处理重要数据前做好备份,并在生产环境中添加充分的异常处理机制。