Не удается скопировать объект openpyxl.Workbook - PullRequest
0 голосов
/ 01 октября 2019

У меня есть файл шаблона .xlsx, который используется для создания объекта openpyxl.Workbook через load_workbook (файл).

Я хочу использовать импортированную рабочую книгу для создания двух новых объектов рабочей книги wb1, wb2 и выполнения различныхпреобразования к каждому из них и в конце сохраните их в словаре рабочих книг.

Я не могу скопировать объекты из словаря без ошибок при обратной записи в файл

  • Установка каждой рабочей книги равной шаблону, создание только ссылочных указателей, а не разных объектов

  • Использование мелкого copy () создает разные объекты, но некоторые свойства все еще ссылаются

  • Использование deepcopy () создает разные объекты с разными свойствами. Однако при экспорте книг обратно в Excel с использованием BytesIO (save_virtual_workbook (wb1)) выдается ошибка типа:

\ stylesheet.py ", строка 232, в write_stylesheet xf. alignment = wb._alignments [style.alignmentId] IndexError: список индексов выходит за пределы диапазона

Я думаю, что глубокая копия нарушает некоторые другие свойства объекта.

from openpyxl import load_workbook
from openpyxl.writer.excel import save_virtual_workbook
from io import BytesIO
import copy
import pysftp

conn = pysftp.Connection()
with conn.open() as f:
    wb_template = load_workbook(file)

wb1 = copy.deepcopy(wb_template)
wb2 = copy.deepcopy(wb_template)

wb1['Sheet'].cell(1,1).value = 'wb1'
wb2['Sheet'].cell(1,1).value = 'wb2'

wbs = {}
wbs['wb1'] = wb1 
wbs['wb2'] = wb2 

# Copying with deepcopy works but exporting to file gives errors!
print(wbs['wb1']['Sheet'].cell(1,1).value)
print(wbs['wb2']['Sheet'].cell(1,1).value)

# Writing to file deep copied workbook gives error
conn.putfo(BytesIO(save_virtual_workbook(wbs['wb1'])), 'file.xlsx')

1 Ответ

0 голосов
/ 02 октября 2019

Объект openpyxl.Workbook не поддерживает DeepCopy.

Чтобы избежать импорта файла шаблона .xlsx несколько раз, я сначала читаю его из соединения как байты, а затем несколько раз выполняю load_workbook, чтобы создать другую книгуобъекты:

connection.open() as f:
    template_file = BytesIO(f.read())

wb1 = load_workbook(template_file)
wb2 = load_workbook(template_file)
...