You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用OpenPyXL为不同工作表设置差异化条件格式?

解决OpenPyXL设置多工作表条件格式的KeyError问题

问题根源

  1. 无效的工作表获取语法:代码中wb['Sponsored Products Campaigns', 'Sponsored Brands Campaigns']是错误写法,OpenPyXL不支持用元组作为键批量获取工作表,且该行未实际参与逻辑执行,属于冗余代码。
  2. 单个工作表遍历错误:for ws in wb.worksheets[3]:会触发异常,因为wb.worksheets[3]是单个工作表对象,并非可迭代列表,不能用for循环遍历。
  3. 索引依赖易出错:依赖wb.worksheets[1:3]按顺序选表,若Excel中工作表顺序变动,会选中错误的目标表,可靠性低。
  4. KeyError核心原因:需确保Excel文件中确实存在Sponsored Products Campaigns、Sponsored Brands Campaigns、SP Search Term Report三个工作表,名称需完全匹配(包括空格、大小写)。

修正后的代码

from openpyxl import load_workbook
from openpyxl.styles import PatternFill, Font
from openpyxl.formatting.rule import FormulaRule

# 加载工作簿
wb = load_workbook('uk-sheet.xlsx')

# 定义两套规则对应的目标工作表
target_sheets_group1 = ['Sponsored Products Campaigns', 'Sponsored Brands Campaigns']
target_sheet_group2 = 'SP Search Term Report'

# 定义条件格式用到的填充和字体样式
fill_red = PatternFill(start_color='ee7811', end_color='ee7811', fill_type='solid')
fill_green = PatternFill(start_color='11ee66', end_color='11ee66', fill_type='solid')
fill_yellow = PatternFill(start_color='dfee11', end_color='dfee11', fill_type='solid')
font = Font(bold=False, color='000000')

# 第一组工作表的条件规则配置
cf_range_group1 = '$A$2:$AT$30000'
formula_dict_group1 = {
    fill_red: ['IF($AR2>0.309,TRUE,FALSE)', 'IF(AND($AR2=0,$AK2>3),TRUE,FALSE)'],
    fill_green: ['IF(AND($AR2>0.0001,$AR2<=0.309),TRUE,FALSE)'],
    fill_yellow: ['IF(AND($AR2=0,$AK2<4),TRUE,FALSE)']
}

# 给第一组工作表应用条件格式
for sheet_name in target_sheets_group1:
    ws = wb[sheet_name]
    for colour_fill, formulas in formula_dict_group1.items():
        for formula in formulas:
            ws.conditional_formatting.add(cf_range_group1,
                                          FormulaRule(
                                              formula=[formula],
                                              stopIfTrue=None,
                                              fill=colour_fill,
                                              font=font)
                                          )

# 第二组工作表的条件规则配置
cf_range_group2 = '$A$2:$AA$3000'
formula_dict_group2 = {
    fill_red: ['IF($Y2>0.309,TRUE,FALSE)', 'IF(AND($Y2=0,$R2>=3),TRUE,FALSE)'],
    fill_green: ['IF(AND($Y2>0.0001,$Y2<=0.309),TRUE,FALSE)'],
    fill_yellow: ['IF(AND($Y2=0,$R2<=2),TRUE,FALSE)']
}

# 给第二组工作表应用条件格式
ws = wb[target_sheet_group2]
for colour_fill, formulas in formula_dict_group2.items():
    for formula in formulas:
        ws.conditional_formatting.add(cf_range_group2,
                                      FormulaRule(
                                          formula=[formula],
                                          stopIfTrue=None,
                                          fill=colour_fill,
                                          font=font)
                                      )

# 保存修改后的工作簿
wb.save('uk-sheet2.xlsx')

关键优化点

  1. 通过工作表名称精准选择目标表,避免依赖索引带来的顺序变动问题。
  2. 将两套规则的配置(范围、公式)分开命名,代码逻辑更清晰,避免变量覆盖。
  3. 删除冗余无效代码,简化工作表遍历逻辑,消除语法错误。

内容的提问来源于stack exchange,提问作者Oleksandr Mishura

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:00:35