2010-06-08 26 views
5

En C# Estoy tratando de obtener una instancia de un objeto Excel.Application desde un objeto Process. Parece que debería ser realmente simple, pero no puedo resolverlo y no puedo encontrar un ejemplo. Para repetir, tengo un objeto System.Diagnostics.Process que sé que se refiere a una instancia en ejecución de Excel. Ahora necesito recuperar un objeto Microsoft.Office.Interop.Excel.Application que se refiera al proceso para poder manipular la aplicación de Excel desde C#.Obtener el objeto Excel.Application desde Process o hwnd en .NET

En caso de que sea más simple, también tengo el ID de HWND y el texto de la ventana asociado a la ventana activa de Excel.

Gracias.

+0

posible duplicado de [¿Cómo obtener la instancia de Excel o la instancia de Excel CLSID usando la ID del proceso?] (Http://stackoverflow.com/questions/770173/how-to-get-excel-instance-or-excel-instance -clsid-using-the-process-id) – Helen

Respuesta

2
+0

Muchas gracias. Pude hacer que esto funcionara. – Abiel

+0

No tengo claro cómo se trata de una respuesta, ya que el otro hilo le da un 'IntPtr HWind' de la instancia de Excel, pero todavía no le da el objeto' Microsoft.Office.Interop.Excel.Application' .. . ¿Me estoy perdiendo de algo? – Antony

+0

No importa, la razón por la que estaba confundido fue porque la respuesta está realmente relacionada con un enlace externo que ya no funciona. De hecho, alguien más publicó el código @ http://pastebin.com/F7gkrAST – Antony

2

How to use Visual C# to automate a running instance of an Office program

using Excel = Microsoft.Office.Interop.Excel; 
:  

private void button1_Click(object sender, System.EventArgs e) 
{ 

    //Excel Application Object 
    Excel.Application oExcelApp; 

    this.Activate(); 

    //Get reference to Excel.Application from the ROT. 
    oExcelApp = (Excel.Application)System.Runtime.InteropServices.Marshal.GetActiveObject("Excel.Application"); 

    //Display the name of the object. 
    MessageBox.Show(oExcelApp.ActiveWorkbook.Name); 

    //Release the reference. 
    oExcelApp = null; 
} 

No está seguro si estrictamente necesario para recuperar objeto de aplicación de la clase Process? Espero que esto ayude.

+2

Lo siento, debería haber mencionado que ya he considerado esta opción. Lamentablemente, este enfoque común no funciona para mí porque necesito poder obtener la última ventana activa de Excel, independientemente de cuántas instancias de Excel se estén ejecutando. GetActiveObject siempre entregará una referencia a la misma instancia de Excel, incluso si hay varias instancias ejecutándose. – Abiel

1

He creado una clase que puede iterar a través de todas las instancias de Excel en ejecución, así como las operaciones de búsqueda instancias de aplicaciones De Hwnd, ProcessID, o un objeto de proceso.

http://www.codeproject.com/Tips/1080611/Get-a-Collection-of-All-Running-Excel-Instances

La respuesta es básicamente un montón de llamadas extern feos a la API de Win32, que es mejor dejar escondido detrás de una interfaz pública limpia.

Esto no se ha probado en todas las versiones de Excel o Windows.

Cuestiones relacionadas