使用 win32com 复制 Excel 工作表时链接断开

Links break when copying Excel sheets with win32com

我正在尝试使用 win32com 将作品sheet从我的工作簿复制到新工作簿。代码运行良好,但新书中的单元格公式指向原书。我想断开新书中的链接,以便将这些公式替换为原始数字。这在 Excel 中很简单,但我无法在 Python.

中找到使用 win32com 客户端的方法。

这是我的代码片段:

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" 文件中,每个包含公式的单元格都引用原始 sheet。如何断开新书中的链接 and/or 仅从原书中复制值?

编辑以回应@martineau 对答案和(不可否认的)Microsoft 文档的反对票。

我想你一直没能找到如何做到这一点,因为你找错了地方。您的问题确实与 Python 或 win32com 没有什么关系。

这一行

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

启动一个名为 xl 的 COM 客户端,它与 excel.exe 通信。您的变量 xl 是围绕 Microsoft COM 对象的薄 Python 包装器,可以调用 Excel VBA 函数。当您键入 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)

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