有几种方法可以将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无法处理它们。 (设置打印区域本身可以很好地工作,但是只能对仅包含数据的文件进行设置。)
所以,我正在寻找:
一种将包含表单对象的整个现有.xlsx工作表添加到另一个现有excel文件中的解决方案,不会弄乱打印结果,或者
一种在不丢失表单对象或图像的情况下更改现有.xlsx图纸的打印区域的方法。
我没有发现任何帮助-但是也许选项2也可以使用win32.com
完成吗?
欢迎任何想法或帮助,谢谢!
答案 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有所帮助。