如何用Python实现基于ID的Excel相邻单元格对比与高亮?
实现方案
我们可以用openpyxl库完成这个需求,它支持Excel文件的读写和单元格样式设置。
1. 安装依赖库
首先安装所需的库:
pip install openpyxl
2. 完整代码
from openpyxl import load_workbook from openpyxl.styles import PatternFill # 定义填充样式 green_fill = PatternFill(start_color='00FF00', end_color='00FF00', fill_type='solid') red_fill = PatternFill(start_color='FF0000', end_color='FF0000', fill_type='solid') yellow_fill = PatternFill(start_color='FFFF00', end_color='FFFF00', fill_type='solid') # 加载Excel文件,替换为你的实际文件路径 wb = load_workbook('input.xlsx') ws = wb.active # 选择活动工作表,也可通过wb['Sheet1']指定具体工作表 # 假设第一行是表头,从第二行开始遍历数据行 for row in ws.iter_rows(min_row=2): has_red = False has_yellow = False # 处理C列(index=2)与D列(index=3) val_c = row[2].value val_d = row[3].value if val_c in (None, '') or val_d in (None, ''): row[2].fill = yellow_fill row[3].fill = yellow_fill has_yellow = True else: if val_c == val_d: row[2].fill = green_fill row[3].fill = green_fill else: row[2].fill = red_fill row[3].fill = red_fill has_red = True # 处理E列(index=4)与F列(index=5) val_e = row[4].value val_f = row[5].value if val_e in (None, '') or val_f in (None, ''): row[4].fill = yellow_fill row[5].fill = yellow_fill has_yellow = True else: if val_e == val_f: row[4].fill = green_fill row[5].fill = green_fill else: row[4].fill = red_fill row[5].fill = red_fill has_red = True # 处理G列(index=6)与H列(index=7) val_g = row[6].value val_h = row[7].value if val_g in (None, '') or val_h in (None, ''): row[6].fill = yellow_fill row[7].fill = yellow_fill has_yellow = True else: if val_g == val_h: row[6].fill = green_fill row[7].fill = green_fill else: row[6].fill = red_fill row[7].fill = red_fill has_red = True # 写入Result列(假设为I列,index=8) if has_red: result_val = "不匹配" elif has_yellow: result_val = "不可比较" else: result_val = "匹配" row[8].value = result_val # 保存结果到新文件,避免覆盖原文件 wb.save('output.xlsx')
3. 代码说明
- 样式定义:提前创建三种填充样式,分别对应内容相等(绿色)、内容不等(红色)、任一单元格为空(黄色)的场景。
- 行遍历:从第二行开始遍历数据行(默认第一行是表头),若你的表头行数不同,调整
min_row参数即可。 - 单元格组对比:对每一组相邻单元格依次判断:
- 任一单元格为空:标记为黄色,同步记录
has_yellow状态。 - 内容相等:标记为绿色。
- 内容不等:标记为红色,同步记录
has_red状态。
- 任一单元格为空:标记为黄色,同步记录
- Result列判定:按优先级输出结果:
- 存在红色单元格 → "不匹配"
- 无红色但有黄色 → "不可比较"
- 全为绿色 → "匹配"
- 文件保存:将结果写入新文件,防止修改原文件数据。
内容的提问来源于stack exchange,提问作者Sweta Rawani
相关产品推荐
相关产品推荐

