使用后期绑定在C#中获取Excel的特定实例

时间:2009-10-13 04:54:29

标签: c# excel late-binding

稍后帮助后期绑定。

我正在尝试延迟绑定excel,我没有任何问题这样做。只有当我有一个以上的excel实例打开时,才遇到一些问题。

我希望能够确定要绑定到哪个excel实例(以及链接事件等)。主要原因是我有一个应用程序从第三方工具打开excel文档,并且不处理事件。我希望能够利用我知道可以捕获事件的特定excel实例。唯一的问题是如果用户已经打开了excel(无论如何)。

如果在绑定后打开excel,显然,我没有遇到问题。只有当excel已经打开时才会这样。

似乎绑定是在第一个打开的实例中完成的。

以下是实际代码:

 Type excelType = Type.GetTypeFromProgID("Excel.Application");

 // Throw exception if the type wasn't found
 if (excelType == null)
     throw new Exception(error);

 //Get the Excel.Application Type by creating a new type instance
 excelApplication = Marshal.GetActiveObject("Excel.Application");

 //Throw exception if the object couldn't be created
 if (excelApplication == null)
     throw new Exception(error);

 this.withEvents = withEvents;

 //Create link between the Word.Applications events and the ApplicationEvents2_WordEvents class
 if (this.withEvents)
 {
     excelEvents = new ExcelApplicationEvents();

     //holds the connection point references of the Word.Application object
     IConnectionPointContainer connectionPointContainer = excelApplication as IConnectionPointContainer;

     //Find the connection point of the GUID found from Red Gate's .Net Reflector
     Guid guid = new Guid("00024413-0000-0000-C000-000000000046");
     connectionPointContainer.FindConnectionPoint(ref guid, out connectionPoint);

     //Advise the Word.Application to send events to the event handler
     connectionPoint.Advise(excelEvents, out sinkCookie);

     excelEvents.WorkbookBeforeSaveEvent += new EventHandler<WorkbookEventArgs>(ExcelEventsWorkbookBeforeSaveEvent);
 }

任何想法?

干杯,

戴尔。

1 个答案:

答案 0 :(得分:4)

获取Excel的特定实例需要您使用AccessibleObjectFromWindow API

Andrew Whitechapel在文章Getting the Application Object in a Shimmed Automation Add-in中对此进行了详细解释。

然而,你想要的是使用后期绑定来执行它。 divo此处详细介绍了这一点:How to use use late binding to get excel instance