【问题标题】:How to connect to existing instance of Excel from PowerShell?如何从 PowerShell 连接到现有的 Excel 实例?
【发布时间】:2012-06-18 10:51:51
【问题描述】:

所有通过 PowerShell 自动化 Excel 的示例都以这一行开头:

PS> $Excel = New-Object -Com Excel.Application

这似乎是在处理一个新的 Excel 实例,例如运行 $Excel.Visible = $true 将显示一个空的空白 Excel 窗口,不会切换到现有工作簿。

如果已经有一个 Excel 实例正在运行,有没有办法连接到它?

【问题讨论】:

  • 您是否需要连接到由特定窗口表示的特定 Excel 实例?如果没有,您还可以查看像这样访问正在运行的 Excel 实例:support.microsoft.com/kb/316126。知识库文章使用 C#,但调用(例如 System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"))应该很容易翻译。
  • 只是为了补充 Ian 的回答:$Excel = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application') 将检索现有的 Excel 实例。
  • 谢谢。但是,我刚刚尝试过,然后执行 $Excel.Visiable = $true - 它仍然打开了一个新的 Excel 窗口。
  • @BorekBernard, [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application') 似乎确实有效,假设现有实例是由同一用户创建的,正如 user2587683 的回答所述。另请注意,您将.Visible 错误输入为.Visiable

标签: excel powershell automation


【解决方案1】:

而不是通常的New-Object -ComObject excel.application 我们这个

$excel = [Runtime.Interopservices.Marshal]::GetActiveObject('Excel.Application')

休息保持不变。

一个缺点。您只会获得由将启动 ps1 的同一用户启动的 excel“实例”。

【讨论】:

    【解决方案2】:

    是的,您可以使用this WIN32 API (AccessibleObjectFromWindow) 通过 HWND [窗口句柄] 访问 COM 对象。

    (参见通过 C# 使用此 api 的 SO 帖子示例 here

    .

    您可能必须用 C# 和/或 manipulate P/Invoke calls via Powershell 编写程序集。

    您可以试一试,看看效果如何。

    【讨论】:

      猜你喜欢
      • 2021-04-16
      • 2018-12-22
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      • 2019-04-03
      • 2014-02-01
      • 2017-09-18
      • 1970-01-01
      相关资源
      最近更新 更多