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

What defines which Excel instance an Excel.Application COM object connects to?

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。这可能是原因吗?

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

为确保连接到现有实例,您可以根据 Attaching to an already running Office application from your application using GetActiveObject or BindToMoniker – .NET4Office 使用 win32com.client.GetActiveObject(<ProgID>)


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

  • 如果您有一个 Excel 实例是在 运行 启动您的程序之前手动启动的,程序会连接到该实例
  • 如果不是,excel.exe 实例由托管 DCOM 进程启动器服务的 svchost.exe 进程生成
    • 此实例最初没有 任何 个工作簿打开
  • 但是,如果您在此之后手动启动 Excel,则会创建第二个实例。 DCOM 实例优先。
  • ,因此在引用同一进程时从同一进程进行的任何进一步分派都将获得相同的实例。
  • 您无法连接到 Excel 进程 运行ning 作为不同的用户(这包括有与没有提升)。

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