在openpyxl中的R1C1

时间:2014-02-11 04:29:11

标签: python pandas openpyxl

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

2 个答案:

答案 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等效函数才能生效。

相关问题