F#Excel Interop:Marshal.GetActiveObject(“Excel.Application”)不起作用

时间:2016-03-24 01:39:00

标签: f# excel-interop f#-scripting

我正在尝试使用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实例正在运行并且它是可见的。谢谢!

1 个答案:

答案 0 :(得分:1)

我已经仔细检查了我的代码,这是从F#脚本中使用Excel的方法(在其他情况下使用Excel-DNA)。但是,经常(特别是在使用加载项时)Excel无法正常关闭,并且一些半死的Excel进程会在任务管理器中挂起,直到它们被手动终止。可能你得到了一个错误的过程,而不是你打开工作簿的过程。