在 openpyxl 条件格式公式中使用多个单元格

Use multiple cells in openpyxl conditional formatting formula

我正在尝试在 Python 中编写一个电子表格,它使用条件格式来查找一行中三个单元格中最大的单元格,并为其填充绿色。我已经能够比较两个单元格,但是在我能看到的 openpyxl 文档中,关于如何编写公式的信息很少,而且 Whosebug 上关于这个问题的信息也很少。

对于两个按预期工作的单元格,我的代码如下:

sheet.conditional_formatting.add(f'G${row+iter_num}', CellIsRule(operator='greaterThan', \
formula=[f'H${row+iter_num}'], fill=greenfill))
sheet.conditional_formatting.add(f'H${row+iter_num}', CellIsRule(operator='greaterThan', \
formula=[f'G${row+iter_num}'], fill=greenfill))

{row+iter_num} 是必需的,因为它在 for 循环中使用。

为了对更多单元格进行比较,我尝试更改公式以包含 and:

sheet.conditional_formatting.add(f'G${row+iter_num}', CellIsRule(operator='greaterThan', \
formula=[f'H${row+iter_num}' and f'I${row+iter_num}'], fill=greenfill))
sheet.conditional_formatting.add(f'H${row+iter_num}', CellIsRule(operator='greaterThan', \
formula=[f'G${row+iter_num}' and f'I${row+iter_num}'], fill=greenfill))
sheet.conditional_formatting.add(f'I${row+iter_num}', CellIsRule(operator='greaterThanOrEqual', \
formula=[f'G${row+iter_num}' and f'H${row+iter_num}'], fill=greenfill))

我不确定在这种情况下使用 and 是否合乎逻辑,但就像我说的那样,文档中的内容很少。我也无法使用任何比较来找出 G、H 和 I 中哪个在 Python 中最大,因为它们由 excel 函数确定。对于上图,每一行的绿色单元格应该是 200、16、82、1890、150(第二个)、1025、527、392、150(第二个),每行应该只有一个绿色单元格。

如果直接在 Excel 中执行此操作,我会使用公式。您需要将相同的公式放入 Rule() 的公式参数中。这是一个完整的工作示例:

from openpyxl import Workbook
from openpyxl.formatting import Rule
from openpyxl.styles import Font, PatternFill, Border
from openpyxl.styles.differential import DifferentialStyle

wb = Workbook()
ws = wb.active

ws.append([1, 2, 3])
ws.append([3, 1, 2])
ws.append([2, 3, 1])
ws.append([1, 2, 3])
ws.append([3, 1, 2])
ws.append([2, 3, 1])

green_fill = PatternFill(bgColor="00FF00")
dxf = DifferentialStyle(fill=green_fill)
r = Rule(type="expression", dxf=dxf, formula=["=A1=MAX($A1:$C1)"])
ws.conditional_formatting.add('A1:C6', r)

# Save the file
wb.save("sample.xlsx")