【问题标题】:Links break when copying Excel sheets with win32com使用 win32com 复制 Excel 工作表时链接中断
【发布时间】:2017-08-03 22:00:54
【问题描述】:

我正在尝试使用 win32com 将工作表从我的工作簿复制到新工作簿。代码运行良好,但新书中的单元格公式指向原书。我想断开新书中的链接,以便将这些公式替换为原始数字。这在 Excel 中是微不足道的,但我无法找到如何在 Python 中使用 win32com 客户端来完成。

这是我的代码的 sn-p:

import win32com.client

xl = win32com.client.gencache.EnsureDispatch('Excel.Application')
xl.Visible = True

#Open & Refresh Spreadsheet
wb = xl.Workbooks.Open(r"C:\Users\me\dummy.xlsx") #Dummy path
print("Refreshing data...")
wb.RefreshAll()

#Create new book and copy target sheet over
print("Opening new workbook")
nwb = xl.Workbooks.Add()
newfile = r"C:\Users\me\dummy2.xlsx"
wb.Worksheets(["Target Sheet"]).Copy(Before=nwb.Worksheets(1))
nwb.SaveAs(newfile)

此代码工作正常,但在保存的“dummy2”文件中,每个包含公式的单元格都引用了原始工作表。如何断开新书中的链接和/或仅复制原书中的值?

【问题讨论】:

    标签: python win32com


    【解决方案1】:

    编辑以回应 @martineau 对答案和(诚然不令人满意的)Microsoft 文档的否决。

    我认为您无法找到如何执行此操作,因为您一直在寻找错误的地方。您的问题实际上与 Python 或 win32com 无关。

    这一行

    xl = win32com.client.gencache.EnsureDispatch('Excel.Application')
    

    启动一个名为xl 的COM 客户端,它与excel.exe 对话。您的变量xl 是一个围绕可以调用 Excel VBA 函数的 Microsoft COM 对象的薄 Python 包装器。当您键入xl. 时,点之后的所有内容都应为 VBA 对象或方法。从调用中返回的任何值(字符串和浮点数除外)都是薄 Python 包装器中的 VBA 对象。 Python 约定不一定适用于此类对象。

    因此,要了解您需要调用哪些函数,您需要查看Excel VBA documentation。该文档的一个困难是它假设您正在编写 VBA,而不是 Python。另一个是写得不太好。

    你需要的VBA方法是Workbook.BreakLink()

    在复制原始工作簿之后和保存副本之前调用它,像这样(我在这里使用你的虚拟文件名,不要指望它在不修复它的情况下实际工作):

    wb.Worksheets(["Target Sheet"]).Copy(Before=nwb.Worksheets(1))
    nwb.BreakLink(Name=r"C:\Users\me\dummy.xlsx", Type=1)
    nwb.SaveAs(newfile)
    

    链接的名称是它指向的文件名,链接的类型是1(用于指向 Excel 电子表格的链接)。在这种情况下,您知道链接源的名称(因为您只是复制了它),因此无需询问文件名是什么,但在一般情况下,您需要致电 Workbook.LinkSources() 以找出它们的名称是,并一一分解。

    【讨论】:

    • 您的答案与链接的 MS 文档一样清晰。
    • 完美运行!感谢您提供详细的答案和背景 VBA 文档。
    猜你喜欢
    • 2015-10-19
    • 2018-06-11
    • 2018-11-15
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-08
    相关资源
    最近更新 更多