2009-07-13 4 views
7

Tengo una aplicación simple C# que tiene que escribir algunos valores en un rango de Excel de una hoja de cálculo específica. Creo una instancia de la aplicación de Excel si no existe, pero si existe quiero configurarlo y tomar una instancia si se utiliza en mi código.Obtenga una instancia de la aplicación Excel con C# por Handle

que utiliza este código para crear una nueva aplicación:

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

para obtener el identificador de ventana de Excel activo i utilizar esta API

[DllImportAttribute("User32.dll")] 
private static extern int FindWindow(String ClassName, String WindowName); 

¿Cómo puedo obtener una instancia de la aplicación Excel un mango?

int hWnd = FindWindow(null, "Microsoft Excel - MySheet.xlsx"); 
Microsoft.Office.Interop.Excel app = ....(hWnd) 

Respuesta

16

utilizar el siguiente código para obtener la primera instancia en ejecución de Excel:

oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 

Ejemplo

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; 
} 
+0

Para mí, 'instancia = new Excel.ApplicationClass();' no funcionó. Tuve que usar 'instance = new Excel.Application();'. –

+2

@DavidMurdoch esto es el resultado de un [cambio en VS2010 para incrustar tipos de interoperabilidad] (http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be -embedded-use-the-applicable-interface-instead.aspx). Cambiar a 'Application()' sobre 'ApplicationClass()' es una solución, obtienes el mismo resultado (¡aunque parezca que estás instanciando una interfaz!). – James

13

Puede haber más de una instancia de Excel ejecutándose.

GetActiveObject (...) se ve en la tabla de objetos en ejecución (ROT) y le daría la última instancia de Excel que se abrió, no necesariamente la correspondiente al manejador de ventana que tiene.

Está buscando AccessibleObjectFromWindow (..). El Andrew Whitechapel post vinculado a en la otra respuesta muestra cómo usar esta función.

Otro enlace - http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx.

Cuestiones relacionadas