基于文本使用openpyxl进行条件格式化

问题描述 投票:0回答:2

我有一个使用 openpyxl 生成的电子表格,其中包含许多系统检查。依据规则; “通过”、“失败”或“信息”一词被插入到我的电子表格的 E 列中。我想使用 Openpyxl 根据通过或失败的值有条件地格式化电子表格的填充。比如绿色代表通过,红色代表失败。

我当前的 openpyxl 代码是:

wb = Workbook()
ws = wb.active
ws.freeze_panes = ws.cell('A3') 
ws.title = 'Best Practice Report for XXX'
ws['A1'] = 'Best Practice Report for XXX %s' % curdate
ws['A2'] = 'IP Address/FQDN'
ws['B2'] = 'BP Number'
ws['C2'] = 'Title'
ws['D2'] = 'Priority'
ws['E2'] = 'Status'
ws['F2'] = 'Description'
a1 = ws['A1']
a1.font = Font(size=20)
redFill = PatternFill(start_color='FFEE1111', end_color='FFEE1111', fill_type='solid')

ws.conditional_formatting.add('E4:E1000', FormatRule(text=['Fail'], stopIfTrue=True, fill=redFill))     
wb.save('bp--TESTresults.xlsx') 

我的问题是条件格式设置规则,我找不到任何基于单元格中的文本进行条件格式设置的好示例。

更新
感谢查理·克拉克的回应,我成功了。创建了两条规则如下。

ws.conditional_formatting.add('E4:E1000', FormulaRule(formula=['NOT(ISERROR(SEARCH("Pass",E4)))'], stopIfTrue=True, fill=greenFill))    
ws.conditional_formatting.add('E4:E1000', FormulaRule(formula=['NOT(ISERROR(SEARCH("Fail",E4)))'], stopIfTrue=True, fill=redFill))
python python-2.7 openpyxl
2个回答
7
投票

我刚刚整理了一个文件并进行了一些反省。它在 A2:A5 中具有值,我认为这应该对您有所帮助:

from openpyxl import load_workbook
wb = load_workbook("Issues/cf.xlsx")
ws = wb.active
ws.conditional_formatting.cf_rules
{'A2:A5': [<openpyxl.formatting.rule.Rule object at 0x108e6dfd0>]}
rule = _['A2:A5']
rule = rule[0]
rule.type
'containsText'
rule.formula
['NOT(ISERROR(SEARCH("fail",A2)))']
rule.stopIfTrue
None
rule.operator
'containsText'

0
投票

解决方案

'NOT(ISERROR(SEARCH("fail",A2)))'
适用于检查单元格是否包含特定值。

如果您正在寻找完美匹配,迄今为止最简单的方法是使用公式和等式(因为

cellIs
的运算符
Rule
在 Excel 中会引发错误):

from openpyxl.formatting.rule import FormulaRule

...

ws.conditional_formatting.add(
    "E4:E1000",
    FormulaRule(formula=['E4="Pass"'], stopIfTrue=True, fill=greenFill),
)
ws.conditional_formatting.add(
    "E4:E1000",
    FormulaRule(formula=['E4="Fail"'], stopIfTrue=True, fill=redFill),
)

或者使用字典,你可以这样做:

text_2_color = {"Pass": greenFill, "Fail": redFill}
for text, color in text_2_color.items():
    ws.conditional_formatting.add(
        "E4:E1000",
        FormulaRule(formula=[f'E4="{text}"'], stopIfTrue=True, fill=color),
    )
© www.soinside.com 2019 - 2024. All rights reserved.