Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# F“Excel互操作:Marshal.GetActiveObject(”Excel.Application“)不起作用_F#_Excel Interop_F# Scripting - Fatal编程技术网

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

F# F“Excel互操作:Marshal.GetActiveObject(”Excel.Application“)不起作用,f#,excel-interop,f#-scripting,F#,Excel Interop,F# Scripting,我正在尝试使用F#自动化一些Excel任务。我实际上有两个问题: 1.如果我使用Excel.Application实例打开工作簿,我将丢失所有加载项,如果我刚刚在Excel中打开工作簿,这些加载项将自动加载。因此,我尝试先在Excel中打开工作簿,加载所有加载项,然后将实例交给F#。然后我得到了第二个问题: 2.实际上,Marshal.GetActiveObject(“Excel.Application”)会打开一个新实例,而不是获取现有实例。代码如下: #r "Microsoft.Office

我正在尝试使用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应用程序:obj

val app1:Excel.Application

val wb:Excel.Workbook=null

可见值:bool=false

val n:int=0


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

我仔细检查了我的代码,这是从F#script使用Excel的方法(在其他情况下使用Excel DNA)。但是,通常(特别是在使用外接程序时)Excel无法正确关闭,一些半死机的Excel进程会挂在任务管理器中,直到手动终止。可能是您的流程出错了,而不是您打开工作簿的流程。

您是否看到我没有Excel,因此无法对其进行F#测试。@GuyCoder:非常感谢您指向该帖子!它似乎能解决我的问题,但需要一些时间来消化。实际上,我不介意做一些手动操作,所以如果第二种方法可行的话,我更喜欢它。这看起来很不合理,为什么它不起作用。非常感谢!当只有一个Excel进程正在运行时,代码就可以工作了!这对我来说已经足够好了。