无法复制openpyxl.工作簿目标

2024-04-19 12:10:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有.xlsx模板文件,用于创建openpyxl.工作簿对象通过加载工作簿(文件)。你知道吗

我想使用导入的工作簿生成两个新的工作簿对象wb1和wb2,并对它们进行不同的转换,最后将它们存储在工作簿字典中。你知道吗

回写文件时,我无法从字典中复制对象而不出错

  • 将每个工作簿设置为模板,只创建引用指针,而不创建不同的对象

  • 使用shallow copy()创建不同的对象,但仍会引用某些属性

  • 使用deepcopy()可以创建具有不同属性的不同对象。但是,使用BytesIO(save\u virtual\u workbook(wb1))将工作簿导出回excel会出现以下类型的错误:

\stylesheet.py", line 232, in write_stylesheet xf.alignment = wb._alignments[style.alignmentId] IndexError: list index out of range

我认为deepcopy弄乱了对象的其他属性。你知道吗

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')

Tags: 文件对象importvaluecellfilesheetworkbook
1条回答
网友
1楼 · 发布于 2024-04-19 12:10:13

那个openpyxl.工作簿对象不支持deepcopy。你知道吗

为了避免多次导入.xlsx模板文件,我首先从连接中将其读取为字节,然后多次执行load\u workbook以创建不同的工作簿对象:

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

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

相关问题 更多 >