使用openpyxl在工作簿之间复制数据



目标:将所有内容从源工作表复制到目标工作表,包括所有格式,不包括公式(只复制值(

预期结果:所有隐藏的列都将保持隐藏,所有行的着色和分组都将复制

实际结果:只有值被复制,没有格式化

数据看起来像这样请注意,单元格B6有公式单元格B9=总和(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)

错误消息:AttributeError:"EmptyCell"对象没有属性"has_style">

我读过一些帖子,其中提到从load_workbook中删除"read_only=True",但即使这样,也以警告消息结束:用户警告:不支持未知扩展,将删除

请原谅我遗漏了任何细节,因为我是Stackoverflow&编程。上面的代码是从stackoverflow本身复制的,但由于我无法在任何帖子上提出进一步的问题,这就是为什么我不得不发布自己的代码。请帮忙。

只读模式完全是关于数据的,因此样式并不真正相关(除了推断日期和时间(,因此不支持has_style方法。创建EmptyCells是为了填充工作表,使行的长度相等。

您可以使用以下代码解决此问题:

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

否则,您看到的警告纯粹是信息性的:使用openpyxl处理后,原始文件中OOXML的一些扩展将丢失。

最新更新