使用openpyxl实现Excel条件格式:报错及无效果问题解决
解决方案
问题1:条件格式规则被Excel移除的修复
用CellIsRule处理跨列AND判断容易触发Excel兼容性问题,改用FormulaRule直接定义Excel原生公式,同时调整规则优先级:
from openpyxl import load_workbook from openpyxl.styles import PatternFill from openpyxl.formatting.rule import FormulaRule # 加载工作簿 wb = load_workbook("your_file.xlsx") ws = wb.active # 定义填充样式 yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid") dark_red_fill = PatternFill(start_color="8B0000", end_color="8B0000", fill_type="solid") # 先添加优先级更高的规则:H列为"Warranty PM"时A列高亮黄色 ws.conditional_formatting.add( "A2:A{}".format(ws.max_row), FormulaRule( formula=['=$H2="Warranty PM"'], stopIfTrue=True, # 满足则跳过后续规则 fill=yellow_fill ) ) # 再添加F、G列均≥30的规则:A列高亮深红色 ws.conditional_formatting.add( "A2:A{}".format(ws.max_row), FormulaRule( formula=['=AND($F2>=30,$G2>=30)'], fill=dark_red_fill ) ) # 保存文件 wb.save("formatted_file.xlsx")
要点说明:
- 使用
FormulaRule直接编写Excel认可的公式,避免CellIsRule的兼容性问题 - 优先级高的规则需先添加,设置
stopIfTrue=True确保满足条件时不触发后续规则 - 公式中使用相对引用(
$H2、$F2),保证规则应用到每一行时自动对应正确列
问题2:遍历单元格设置格式无效果的修复
遍历无效果通常是因为未获取到F、G列的计算结果(openpyxl默认读取公式而非计算值),或者填充样式设置错误。修复代码如下:
from openpyxl import load_workbook from openpyxl.styles import PatternFill # 加载工作簿时指定data_only=True,读取已计算的单元格值(仅适用于已保存过的Excel文件) wb = load_workbook("your_file.xlsx", data_only=True) ws = wb.active yellow_fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid") dark_red_fill = PatternFill(start_color="8B0000", end_color="8B0000", fill_type="solid") # 遍历数据行(假设第1行是表头) for row in ws.iter_rows(min_row=2, max_row=ws.max_row): a_cell = row[0] # A列单元格 h_cell = row[7] # H列单元格(索引从0开始) f_cell = row[5] # F列单元格 g_cell = row[6] # G列单元格 # 先判断优先级高的条件 if h_cell.value == "Warranty PM": a_cell.fill = yellow_fill else: # 检查F、G列的值是否均≥30(处理空值或非数字的情况) if isinstance(f_cell.value, (int, float)) and isinstance(g_cell.value, (int, float)): if f_cell.value >=30 and g_cell.value >=30: a_cell.fill = dark_red_fill wb.save("formatted_file.xlsx")
要点说明:
- 必须用
data_only=True加载文件才能读取公式计算后的结果,若文件是新生成的(未手动打开计算过),需先手动打开保存一次,或改用条件格式方案 - 遍历单元格时要处理空值或非数字的情况,避免报错
- 严格按优先级判断:先检查H列条件,再检查F、G列条件
内容的提问来源于stack exchange,提问作者llindgren
相关产品推荐
相关产品推荐

