【问题标题】:Side effect when copying .xlsx sheet to different excel file将 .xlsx 工作表复制到不同的 excel 文件时的副作用
【发布时间】: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 无法处理它们。 (设置打印区域本身工作正常,但只能使用仅包含数据的文件。)

所以,我正在寻找:

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

  2. 一种在不丢失表单对象或图像的情况下更改现有 .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


【解决方案1】:

...我终于找到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 有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2020-04-24
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多