2014-02-11 70 views
3

我試圖在openpyxl中設置條件格式來模擬突出顯示重複值。用這個簡單的代碼,我應該能夠突出顯示連續的重複項(但不是重複序列中的第一個值)。R1C1 in 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風格的引用?

回答

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等價物,以使其工作。

+0

這是我在SO中讀過的最徹底的答案。謝謝! – dmvianna

2

Openpyxl不支持Excel RC表示法。

您可以使用A1符號代替這意味着等效公式爲=B2(我認爲)。

但是,您應該先驗證它是否在Excel中正常工作。

我的感覺是,它不會。通常條件格式化使用絕對單元格引用$B$2而不是相對單元格引用B1

如果確實有效,則將公式轉換爲A1表示法,並且該表示法應在Openpyxl中工作。

+0

它沒有。它不分青紅皁白地突出一切。 – dmvianna