经常需要对比两个Excel表格的差异。无论是财务对账、库存盘点还是数据迁移,快速准确地找出数据差异都能节省大量时间。今天分享用Python实现Excel数据对比的实用方案。
核心思路与准备工作
对比Excel数据的关键在于选择合适的比对维度。通常我们会基于唯一标识列(如订单号、产品ID)进行关联比对,然后检查其他字段的差异。
首先安装必要的库:
bash
pip install pandas openpyxl
基于Pandas的智能对比方案
以下是一个完整的双表对比实现:
python
ini
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
ini
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数据对比,不仅能够自定义对比规则,还能将对比过程集成到自动化流程中,大幅提升数据处理效率。记得在处理重要数据前做好备份,并在生产环境中添加充分的异常处理机制。