python – openpyxl中的R1C1

我正在尝试在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样式引用?

解决方法:

关于突出显示顺序值的重复,您想要的公式是

=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等效函数才能生效.

上一篇:python – 在范围内分配多个值


下一篇:Python和openpyxl – 改变列宽以适应?