使用C#通过句柄获取Excel应用程序实例

11

我有一个简单的C#应用程序,需要将一些值写入特定工作表的Excel范围内。 如果不存在Excel应用程序实例,我会创建它,但是如果已经存在,我想将其设置为活动状态并获取其实例以在我的代码中使用。

我使用以下代码创建新的应用程序:

Microsoft.Office.Interop.Excel app = 
   new Microsoft.Office.Interop.Excel.Application();
app.Visible = true;

我使用这个 API 来获取当前活动的 Excel 窗口的句柄

[DllImportAttribute("User32.dll")]
private static extern int FindWindow(String ClassName, String WindowName);
我该如何通过句柄获取Excel应用程序的实例?
int hWnd = FindWindow(null, "Microsoft Excel - MySheet.xlsx");
Microsoft.Office.Interop.Excel app = ....(hWnd)
3个回答

23

使用以下代码获取第一个正在运行的 Excel 实例:

oExcelApp =  (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
示例
public Excel.Application StartExcel()
{
    Excel.Application instance = null;
    try
    {
       instance = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application");
    }
    catch (System.Runtime.InteropServices.COMException ex)
    {
       instance = new Excel.ApplicationClass();
    }

    return instance;
}

1
对我来说,instance = new Excel.ApplicationClass(); 没有起作用。我不得不使用 instance = new Excel.Application(); - David Murdoch
2
@DavidMurdoch 这是由于 VS2010 中嵌入互操作类型的更改 导致的结果。使用 Application() 而不是 ApplicationClass() 是一种解决方法,尽管看起来你正在实例化一个接口,但实际上会得到相同的结果! - James

15

链接已经失效。 - Bigbob556677

2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接