2014-02-11 8 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) 

С диапазоном, начиная с В2 (он же, B2: B1048576)

Примечание - это, как представляется, сломанной в текущей ветке 1.8.3 openpyxl, но вскоре будет исправлена ​​в ветви 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 не поддерживает первенствовать RC, условное форматирование будет записывать формулу, как предусмотрено. К сожалению, excel позволяет обозначать R1C1 только поверхностно как флаг и преобразовывать все формулы обратно в их эквивалент A1 при сохранении, то есть вам понадобится функция для преобразования всех функций R1C1 в их эквиваленты A1, чтобы это работало.

+0

Это самый тщательный ответ, который я когда-либо читал в SO. Спасибо! – dmvianna

2

Openpyxl не поддерживает Excel RC обозначение.

Вместо этого вы можете использовать нотацию A1, что означает, что эквивалентная формула равна =B2 (я думаю).

Однако вы должны убедиться, что он действительно работает в Excel в первую очередь.

Мое ощущение, что оно не будет. В общем случае условное форматирование использует абсолютные ссылки на ячейки $B$2 вместо ссылок на относительные ячейки B1.

Если он действительно работает, преобразуйте формулу в формулу A1, и это должно работать в Openpyxl.

+0

Это не так. Это подчеркивает все без разбора. – dmvianna

Смежные вопросы