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 进程会挂在任务管理器中,直到它们被手动杀死。可能您遇到了错误的过程,而不是您打开工作簿的过程。
我正在尝试使用 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 进程会挂在任务管理器中,直到它们被手动杀死。可能您遇到了错误的过程,而不是您打开工作簿的过程。