将.xlsx工作表复制到其他Excel文件时的副作用

时间:2019-04-29 14:07:07

标签: python excel openpyxl win32com

有几种方法可以将Excel(.xlsx)工作表复制到另一个现有的Excel文件中。因为我必须处理包含格式化的表单对象(彩色文本框,行等)的工作表,所以唯一可行的解​​决方案是使用win32.com.client方法,如here所述。使用该方法,我可以将一个现有excel文件中的工作表插入另一个现有excel文件中。

但是这样做有副作用,我想避免:

添加之前,我的目标文件包含的内容在打印或以PDF格式保存时恰好在一页上。

添加工作表后,我的目标文件工作表在打印或以PDF格式保存时将产生 72页。第一页包含数据,其他71页为纯白色。

我很确定这不是代码问题,它看起来像这样:

from win32com.client import Dispatch

xl = Dispatch("Excel.Application")

wb1 = xl.Workbooks.Open(Filename=template)
wb2 = xl.Workbooks.Open(Filename=destination)

ws1 = wb1.Worksheets(1)
ws1.Copy(Before=wb2.Worksheets(1))

wb2.Close(SaveChanges=True)
xl.Quit()

当然可以通过在excel中手动定义打印区域来更改此行为。也可以通过将打印设置设置为仅处理页面1来更改它。但这不是解决此问题的理想解决方案,因为使用此文件的其他人往往不会看打印预览,那么,您会发现这堆打印机上的略微温暖的空白纸。

我尝试使用openpyxl设置单页复印后的打印区域。这行不通,因为保存结果会从我的工作表中删除所有表单对象,因为openpyxl无法处理它们。 (设置打印区域本身可以很好地工作,但是只能对仅包含数据的文件进行设置。)

所以,我正在寻找:

  1. 一种将包含表单对象的整个现有.xlsx工作表添加到另一个现有excel文件中的解决方案,不会弄乱打印结果,或者

  2. 一种在不丢失表单对象或图像的情况下更改现有.xlsx图纸的打印区域的方法。

我没有发现任何帮助-但是也许选项2也可以使用win32.com完成吗?

欢迎任何想法或帮助,谢谢!

1 个答案:

答案 0 :(得分:0)

...在我终于找到this page之后:

解决方案,使用win32.com.client

Worksheets(n).PageSetup.PrintArea  = "$A$1:$L$32" # desired print area range goes here

对于我来说,我想设置文件中最后一个(最右边)工作表的打印区域:

wb2_lastsheet = len(wb2.Worksheets)
wb2.Worksheets(wb2_lastsheet).PageSetup.PrintArea  = "$A$1:$L$32" 

次要问题:

此功能仅对文件起作用一次。第二次尝试这样设置打印区域时,一个小的弹出窗口希望我为第二个打印区域插入一个名称,即使该名称已应用于文件中的另一张纸上也是如此。

由于名称Print_Area是excel的一个内置术语,并且第一次执行已经自动设置了该名称,因此,每次其他尝试都会在弹出窗口中显示,希望我为新的打印区域插入有效的名称

尽管如此,多次设置打印区域还是可以的!您只需要输入名称即可。

在使用Excel Name-Object设置新的打印区域之前,我曾尝试处理现有区域,但这根本没有用。似乎内置术语Print_Area是excel中的一种特殊对象,普通Name方法在这里不起作用。

但是我已经达到了我想要的-现在看,这很愚蠢。

希望对其他一些excel-automation-pythonista有所帮助。