F# Excel 互操作:Marshal.GetActiveObject("Excel.Application") 不起作用

F# Excel Interop: Marshal.GetActiveObject("Excel.Application") does not work

我正在尝试使用 F# 自动执行一些 Excel 任务。我实际上有两个问题: 1. 如果我使用 Excel.Application 实例打开工作簿,我会错过所有在 Excel 中打开工作簿时自动加载的加载项。所以我尝试先在 Excel 中打开工作簿,加载所有加载项,然后将实例交给 F#。然后我得到了第二个问题: 2. Marshal.GetActiveObject("Excel.Application")实际上是打开一个新实例,而不是获取现有实例。代码如下:

#r "Microsoft.Office.Interop.Excel"
#r "office"

open Microsoft.Office.Interop
open System
open System.Runtime.InteropServices

let app = Marshal.GetActiveObject("Excel.Application")
let app1 = app :?> Excel.Application

let wb = app1.ActiveWorkbook

let visible = app1.Visible

let n = app1.Workbooks.Count

输出为:

val app : obj

val app1 : Excel.Application

val wb : Excel.Workbook = null

val visible : bool = false

val n : int = 0

但我非常确定我有一个 Excel 实例 运行 并且它是可见的。谢谢!

我仔细检查了我的代码,这是在 F# 脚本中使用 Excel 的方法(在其他情况下使用 Excel-DNA)。但是,很多时候(尤其是在使用加载项时)Excel 无法正确关闭,一些半死的 Excel 进程会挂在任务管理器中,直到它们被手动杀死。可能您遇到了错误的过程,而不是您打开工作簿的过程。