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

amb*_*s58 5 python excel pywin32 win32com

import win32com.client as win32

excel = win32.gencache.EnsureDispatch('Excel.Application')
for wb in excel.Workbooks:
    print(wb.Name)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

iva*_*eev 3

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

\n

为了确保连接到现有实例,您可以使用 GetActiveObject 或 BindToMoniker \xe2\x80\x93 .NET4Office 从应用程序附加到已运行的 Office 应用win32com.client.GetActiveObject(<ProgID>)程序。

\n
\n

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

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

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

\n