четене на работен лист и запазване на условното форматиране

Опитвам се да прочета работен лист на Excel с openpyxl. Мисля, че губя информацията за условно форматиране в листа, когато го чета така:

xl = openpyxl.load_workbook(filename)

Когато прочета всички клетки във файла и го запазя. Получавам електронна таблица, в която нито едно от условните форматирания не е приложено.

Мога да намеря много начини за добавяне на условно форматиране към електронна таблица на http://openpyxl.readthedocs.org/en/latest/formatting.html

Но не мога да намеря начин да прочета информация за условно форматиране в съществуващ работен лист.

Конкретният код, който използвам за извършване на четене и писане, е,

import openpyxl as xl

xlf = xl.load_workbook(r'd:\test\book1.xlsx')
sh = xlf.get_sheet_by_name('Sheet1')
allcells = sh.get_cell_collection()

wb = xl.Workbook()
ws = wb.create_sheet()

for c in allcells:
    row = c.row
    col = xl.cell.column_index_from_string(c.column)
    new_cell = ws.cell(row=row, column=col)
    new_cell.value = c.value
    new_cell.style = c.style.copy()

ws.title = 'test'
wb.save(r'd:\test\book1w.xlsx')

person nitin    schedule 27.02.2015    source източник
comment
Можете ли да предоставите примерен код за това как четете и записвате? Освен това, ако е възможно, можете ли да предоставите връзка към примерен excel файл? В миналото е имало проблеми със специфични атрибути на условно форматиране. Може да сте се натъкнали на грешка или да го запазвате или четете по такъв начин, че да загуби условното форматиране.   -  person Alejandro    schedule 28.02.2015
comment
ConditionalFormatting е различно за всеки работен лист в работна книга. Може да включва или да не включва препратки към стилове, дефинирани другаде. Както при много неща във файловете на Excel, това прави копирането изключително трудно.   -  person Charlie Clark    schedule 04.03.2015
comment
Това открих и аз. Правилата cf_rules имаха dfxID, но не знам къде са дефинирани правилата dfx.   -  person Alejandro    schedule 04.03.2015


Отговори (1)


Много съм близо, но не мога да накарам цвета да остане. Все още има грешка, но поне следното добавя запазване на правилата за условно форматиране, ако не и избора за запълване:

for range_string in sh.conditional_formatting.cf_rules:
    for cfRule in sh.conditional_formatting.cf_rules[range_string]:
        ws.conditional_formatting.add(range_string, cfRule)

Същото се постига с тази една подложка (но същия краен резултат):

ws.conditional_formatting.update(sh.conditional_formatting.cf_rules)

Сега, ако отворите Manage Rules в excel, всички правила са там, но когато отворите файла, той изисква автоматично поправяне и губя цвета. Ето супер полезния дневник (сарказмът е предназначен тук):

<repairedRecord>Repaired Records: Conditional formatting from /xl/worksheets/sheet2.xml</repairedRecord></repairedRecords>

Получих подобни резултати, когато се опитах да копирам трите атрибута на conditional_formatting директно така:

ws.conditional_formatting.cf_rules = sh.conditional_formatting.cf_rules.copy()
ws.conditional_formatting.max_priority = sh.conditional_formatting.max_priority
ws.conditional_formatting.parse_rules = sh.conditional_formatting.parse_rules.copy()

Разглеждах изходния код за идеи .

РЕДАКТИРАНЕ

Има една наистина лесна алтернатива. Не създавайте чисто нова работна книга и работен лист и работете върху тях от нулата. Просто променете оригинала според нуждите и след това го запазете под друго име. Или можете дори да започнете, като го запазите под различно име, за да създадете копие, след което да промените копието. Това ще запази всички правила за форматиране.

person Alejandro    schedule 04.03.2015
comment
Изглежда, че може да се приближи доста. Но ще трябва да сравните генерираните файлове с помощта на MS Office OpenXML Productivity Tool, за да видите какво липсва или е различно. Достатъчно е да се каже, че копирането на части от Excel файлове рядко е толкова лесно, колкото изглежда. Вашето предложение за запазване под ново име е наистина най-добрият подход. - person Charlie Clark; 04.03.2015