【发布时间】:2019-04-29 14:07:06
【问题描述】:
有多种方法可以将 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 来完成?
欢迎任何想法或帮助,谢谢!
【问题讨论】:
-
您可以使用 VBA 吗?在 VBA 中,您可以通过使用 ActiveSheet.PageSetup.PrintArea 并为其分配范围地址来定义打印区域。
-
如果可以在 Excel GUI 中完成,那么原则上应该可以用
win32com完成(因为win32com所做的只是控制一个Excel 的运行实例)。 -
@AntonioRodulfo:在我的 PC 上,VBA 可以工作,但我不确定这种方法是否适用于其他人,因为存在一些非常严格的系统限制,由 GPO 强制执行。由于安全原因,我怀疑这种限制会阻止 excel VBA,然后这无济于事。除此之外 - 一个好主意,谢谢!
-
@JohnY:所以,有希望!我很想使用
win32.com,只是为了留在已经使用的上下文中而不是添加另一个框架(但我会这样做,如果它可以工作的话)。但是......是的......“原则上”。我不知道如何做到这一点。我什至不知道从哪里开始进一步调查。但感谢您指出可能有所帮助的大方向!
标签: python excel openpyxl win32com