#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. Да, возможно, вам придется выполнить некоторую дополнительную обработку из-за того, как работают стили. Если ваш исходный файл не очень большой, вам, вероятно, лучше не использовать режим только для чтения, но учтите, что копирование массивов стилей между книгами, скорее всего, все равно завершится неудачей.