什么定义了 Excel.Application COM 对象连接到哪个 Excel 实例?


import win32com.client as win32
excel = win32.gencache.EnsureDispatch('Excel.Application')
for wb in excel.Workbooks:
print(wb.Name)

当我使用Sublime Text运行此脚本时: 将打印打开的工作簿的名称列表。

当我使用 PyCharm 运行此脚本时: 我得到一个空白列表。

两者都在同一台PC上,并且使用相同的Python版本(3.5 32位(。

不确定这条信息是否有所作为,但是当我第一次下载PyCharm时,我从未运行过PyCharm安装程序。我下载了zip文件,每次都从解压缩的文件夹中运行PyCharm.exe。这可能是原因吗?

原因必须是,在一种情况下,您连接到正在运行的 Excel 实例,而在另一种情况下,打开一个新实例(或连接到其他实例(。

为了确保连接到现有实例,您可以使用 GetActiveObject 或 BindToMoniker 从应用程序附加到已在运行的 Office 应用程序 – 中使用win32com.client.GetActiveObject(<ProgID>)。NET4办公室。


这些是我注意到的模式,这些模式控制Excel.Application对象连接到哪个 Excel 实例:

  • 如果您有在运行程序之前手动启动的 Excel 实例,则程序将连接到该实例
  • 否则,excel.exe实例将由托管 DCOM 进程启动器服务的svchost.exe进程生成
    • 此实例最初未打开任何工作簿
  • 但是,如果在此之后手动启动 Excel,则会创建第二个实例。DCOM 实例优先。
  • 只要存在对实例的引用,即使在.Quit后也不会关闭该实例,因此来自同一进程的任何进一步调度,当它有对它的引用时,都将获得相同的实例。
  • 无法连接到以不同用户身份运行的 Excel 进程(这包括使用 vs 不提升(。

因此,例如,如果您从交互式控制台运行代码,或者 IDE 不会每次都重新启动 Python 进程(不太可能但可能(,您可能有旧的现有引用。

最新更新