Можно читать вкладку Excel в код и записывать обратно ту же вкладку с форматированием - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть код, который создает файл Excel с именем file_A с использованием XlsxWriter. Пользователи прислали мне файл Excel с именем file_b, в котором есть только одна вкладка с именем tab_b. Они хотят, чтобы tab_b было добавлено к file_A. Это tab_b включает в себя много форматирования (некоторые из которых, я считаю, подпадают под «богатое» форматирование »), которые я бы предпочел не кодировать жестко в кодовую базу.

Есть ли способ загрузить tab_b в базу кода в виде объекта с вкладками? Затем я мог бы добавить эту вкладку к file_A, и все форматирование и жесткое кодирование будут инкапсулированы в объекте вкладки.

Мы уже используем XlsxWriter и openpyxl в нашей кодовой базе, но я не знаю, были ли они действительно созданы для такого рода вещей. Я открыт для других модулей, если это необходимо, но он должен быть Python-совместимым.

Пример кода того, как мы сейчас создаем file_A выглядит следующим образом:

writer = pd.ExcelWriter(output_file_path, engine='xlsxwriter')
someDataFrame.to_excel(writer, sheet_name='PreExisting_Tab')
writer.save()

В идеале, я надеюсь выяснить, есть ли реальный код для следующего псевдокода ниже:

writer = pd.ExcelWriter(output_file_path, engine='xlsxwriter')
someDataFrame.to_excel(writer, sheet_name='PreExisting_Tab')

tab_b = readTabWithFormattingIntoPython("filePathToFile_B")
tab_b.to_Excel(writer,sheet_name='tab_b')

writer.save()

Этот снимок экрана ниже показывает tab_b внутри file_b.
A screenshot of a mockup of the excel tab they want appended is pictured here:

ОБНОВЛЕНИЕ Спасибо, @DeepSpace, за то, что привлекли мое внимание к StyleFrame. Это выглядит многообещающе, но моя первоначальная попытка доказательства концепции не удалась. Вот что я попробовал (кажется, что он достаточно похож на код в вашем примере, но я не уверен, почему он не работает):

    from StyleFrame import StyleFrame
    writer = pd.ExcelWriter(output_file_path, engine='openpyxl')

    tab_to_convert= StyleFrame.read_excel(file_B_file_path, read_style=True)

    tab_to_convert.to_excel(writer)
    writer.save()

Результатом приведенного выше кода является то, что файл Excel создается на одном листе без данных или форматирования из файла, который он должен был прочитать. В ячейке A1 указано: «Этот лист содержит XML-данные FactSet для использования с кодами этой книги = FDS. Изменение содержимого листа может повредить функциональность wrokbook = FDS».

Не уверен, что именно поэтому он не работает, но мне пришлось указать при создании писателя "engine = 'openpyxl'". Если я не указал это, он попытался использовать XlsxWriter и потерпел неудачу из-за AttributeError: у объекта «Рабочая книга» нет атрибута «get_sheet_by_name»

2-е ОБНОВЛЕНИЕ StyleFrame закончил работу. См. Комментарии ниже в ответе @ DeepSpace.

1 Ответ

0 голосов
/ 19 ноября 2018

StyleFrame (который, как отказ от ответственности, я один из авторов) может сделать это.

from StyleFrame import StyleFrame

writer = pd.ExcelWriter(output_file_path)
someDataFrame.to_excel(writer, sheet_name='PreExisting_Tab')

tab_b = StyleFrame.read_excel("filePathToFile_B", read_style=True)
tab_b.to_Excel(writer, sheet_name='tab_b')

writer.save()

Два предостережения:

  • На данный момент StyleFrame поддерживает только openpyxl <= 2.2.5, что довольно старо.Я планирую добавить поддержку более новых версий в ближайшем будущем </p>

  • Поддерживаются не все элементы оформления, но большинство, если не все базовые элементы.

...