我正在尝试在 openpyxl 中设置条件格式以模拟突出显示的重复值。使用这个简单的代码,我应该能够突出显示连续的重复项(但不是重复序列中的第一个值)。
from pandas import *
data = DataFrame({'a':'a a a b b b c b c a f'.split()})
wb = ExcelWriter('test.xlsx')
data.to_excel(wb)
ws = wb.sheets['Sheet1']
from openpyxl.style import Color, Fill
# Create fill
redFill = Fill()
redFill.start_color.index = 'FFEE1111'
redFill.end_color.index = 'FFEE1111'
redFill.fill_type = Fill.FILL_SOLID
ws.conditional_formatting.addCellIs("B1:B1048576", 'equal', "=R[1]C", True, wb.book, None, None, redFill)
wb.save()
但是,当我在Excel中打开它时,我收到与条件格式相关的错误,并且数据未按预期突出显示。 openpyxl是否能够处理R1C1样式引用?
答案 0 :(得分:3)
Openpyxl不支持Excel RC
表示法。
您可以使用A1
表示法,这意味着等效公式为=B2
(我认为)。
但是,您应首先验证它是否在Excel中有效。
我的感觉是它不会。通常,条件格式使用绝对单元格引用$B$2
而不是相对单元格引用B1
。
如果确实有效,请将您的公式转换为A1
表示法,这应该适用于Openpyxl。
答案 1 :(得分:3)
关于突出显示顺序值的重复项,您想要的公式是
=AND(B1<>"",B2=B1)
范围从B2开始(又名,B2:B1048576)
注意 - 这似乎在openpyxl的当前1.8.3分支中被破坏,但很快将在1.9分支中修复。
from openpyxl import Workbook
from openpyxl.style import Color, Fill
wb = Workbook()
ws = wb.active
ws['B1'] = 1
ws['B2'] = 2
ws['B3'] = 3
ws['B4'] = 3
ws['B5'] = 7
ws['B6'] = 4
ws['B7'] = 7
# Create fill
redFill = Fill()
redFill.start_color.index = 'FFEE1111'
redFill.end_color.index = 'FFEE1111'
redFill.fill_type = Fill.FILL_SOLID
dxfId = ws.conditional_formatting.addDxfStyle(wb, None, None, redFill)
ws.conditional_formatting.addCustomRule('B2:B1048576',
{'type': 'expression', 'dxfId': dxfId, 'formula': ['AND(B1<>"",B2=B1)']})
wb.save('test.xlsx')
作为进一步的参考:
如果您想突出显示所有重复项:
COUNTIF(B:B,B1)→1
如果要突出显示除第一次出现以外的所有重复项:
COUNTIF($ B $ 2:$ B2,B2)→1
如果要突出显示顺序重复项,则最后一项除外:
COUNTIF(B1:B2,B2)→1
关于RC表示法 - 虽然openpyxl不支持excel RC表示法,但条件格式化将按照提供的方式编写公式。不幸的是,excel只能将R1C1表示法表面化,并在保存时将所有公式转换回它们的A1等效值,这意味着您需要一个函数将所有R1C1函数转换为它们的A1等效函数才能生效。