копирование данных между книгами с помощью openpyxl

#python #excel #openpyxl

#python #excel #openpyxl

Вопрос:

Цель: скопировать каждую вещь с исходного листа на лист назначения, включая все форматирование, исключая формулы (скопируйте только значения)

Ожидаемый результат: все скрытые столбцы остаются скрытыми, все раскраски и группировки строк должны быть скопированы

Фактический результат: копируются только значения, форматирование отсутствует

Данные выглядят примерно так. Обратите внимание, что ячейка B6 содержит формулу Cell B9 = sum(B6: B8)

Код, который я пробовал:

  import openpyxl as xl
 from copy import copy

 t1 = r'C:Temptest1.xlsx'
 t2 = r'C:Temptest2.xlsx'

 wb1 = xl.load_workbook(t1, read_only=True, keep_links=False, keep_vba=False, data_only=True)
 #source workbook has many other worksheets, so index has been given to pick the right one
 ws1 = wb1.worksheets[7]

 wb2 = xl.load_workbook(t2)
 ws2 = wb2.active

 mr = ws1.max_row
 mc = ws1.max_column

 for i in range(1,mr 1):
 for j in range(1,mc 1):
     c = ws1.cell(row=i, column=j)
     ws2.cell(row=i,column=j).value = c.value
     #if ws2.cell(row=i,column=j).value is not None:
     if c.has_style:
         ws2.cell()._style = copy(c.style)

  wb2.save(t2)
  

Сообщение об ошибке: ошибка атрибута: объект ‘EmptyCell’ не имеет атрибута ‘has_style’

Я прочитал несколько сообщений, в которых упоминалось, что нужно избавиться от ‘read_only = True’ из load_workbook, но даже это закончилось предупреждающим сообщением: предупреждение пользователя: неизвестное расширение не поддерживается и будет удалено

Пожалуйста, извините меня за отсутствие каких-либо деталей, поскольку я новичок в Stackoverflow и программировании в целом. Приведенный выше код был скопирован из самого stackoverflow, но поскольку я не мог задавать дополнительные вопросы ни по одному сообщению, поэтому мне пришлось опубликовать свои собственные с проблемами. Пожалуйста, помогите.

Ответ №1:

Режим только для чтения — это данные, поэтому стиль на самом деле не имеет значения (за исключением определения дат и времени), и поэтому has_style метод не поддерживается. Пустые ячейки создаются для заполнения листа, чтобы строки имели четную длину.

Возможно, вы сможете обойти это, используя следующий код:

 if hasattr(c, 'style_array') and any(c.style_array):
   c2._style = c.style_array
  

В противном случае предупреждения, которые вы видите, носят чисто информационный характер: некоторые расширения OOXML в исходном файле будут потеряны после обработки с помощью openpyxl.

Комментарии:

1. Спасибо, Чарли, но это не сработало. Хотя это даже не сработало. Форматирование не копировалось.

2. Да, возможно, вам придется выполнить некоторую дополнительную обработку из-за того, как работают стили. Если ваш исходный файл не очень большой, вам, вероятно, лучше не использовать режим только для чтения, но учтите, что копирование массивов стилей между книгами, скорее всего, все равно завершится неудачей.