如何使用getActiveObject(“Excel.Application”)

我需要在C#中完成一个应用程序。 现在我想获得一个控制Excel文件来获取数据的函数。 我用getActiveObject(“Excel.Application”),但是这没有返回。 而且,我不能在VS2008中使用Excel.Application,而使用Microsoft.Office.Interop.Excel.Application代替它。 那么有没有另外一种方法来获得我想要的?

Microsoft.Office.Interop.Excel.Application e =(Microsoft.Office.Interop.Excel.Application)Marshal.GetActiveObject(“Excel.Application”);

在玩了大约半天之后,我终于想出了如何使这项工作,所以你可以locking一个开放的Excel副本。 我的用户一直抱怨有太多的Excel实例打开。

以下是我所做的工作的一小部分:

_Application excelApp; try { excelApp = (_Application)Marshal.GetActiveObject("Excel.Application"); } catch(Exception) { // this is important. If Excel is not running, GetActiveObject will throw // an exception excelApp = null; } if( excelApp == null ) { excelApp = new ApplicationClass(); } 

我一直在追寻这一段时间,终于有一段时间了,把它弄清楚了。

为了能够将Excel对象模型称为“Excel”,可以通过名称空间(或文档)顶部的using语句来创build别名,如下所示:

 using Excel = Microsoft.Office.Interop.Excel; 

此后,您可以参考Excel.Application而不是冗长的Microsoft.Office.Interop.Excel.Application

至于你为什么调用Marshal.GetActiveObject失败,我不能肯定地说。 一些想法:

(1)你确定有一个Excel的运行实例已经存在吗? 如果不是,则创build一个新的Excel应用程序:

 Excel.Application xlApp = new Excel.Application(); 

(2)如果肯定有一个Excel应用程序已经在运行,那么如果Excel应用程序从未失去焦点,可能还没有将Excel实例添加到运行对象表(ROT)中。 有关详细信息,请参阅: Visual C#.NET错误附加到运行Office应用程序的实例 。 我相信Marshal.GetActiveObject方法在这种情况下应该抛出一个exception – 不是悄悄地返回null – 但是这似乎仍然有潜在的相关性。

我希望这有帮助…

麦克风

请参阅以下链接中提供的MS KB …

http://support.microsoft.com/kb/238610