2009-07-13 8 views
7

Ho una semplice applicazione C# che deve scrivere alcuni valori in intervalli di Excel di un foglio di lavoro specifico. Se non esiste, creo un'istanza dell'applicazione Excel, ma se esiste voglio impostarla e prendere un'istanza se deve essere utilizzata nel mio codice.Ottieni istanza dell'applicazione Excel con C# da Handle

Io uso questo codice per creare una nuova applicazione:

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

per ottenere l'handle della finestra di Excel attiva io uso questa API

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

come posso ottenere un'istanza di applicazione Excel una maniglia?

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

risposta

16

utilizzare il seguente codice per ottenere la prima istanza in esecuzione di Excel:

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

Esempio

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

Per me, 'instance = new Excel.ApplicationClass();' non ha funzionato. Ho dovuto usare 'instance = new Excel.Application();'. –

+2

@DavidMurdoch questo è il risultato di una [modifica in VS2010 per incorporare tipi di interoperabilità] (http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be -Embedded-uso-the-applicabile-interfaccia-instead.aspx). Passare a 'Application()' su 'ApplicationClass()' è una soluzione, si ottiene lo stesso risultato (anche se sembra che si stia creando un'istanza di un'interfaccia!). – James

13

Potrebbe esserci più di un'istanza di Excel in esecuzione.

GetActiveObject (...) esamina la tabella degli oggetti in esecuzione (ROT) e fornisce l'ultima istanza di Excel aperta, non necessariamente quella corrispondente all'handle della finestra.

Stai cercando AccessibleObjectFromWindow (..). Il numero Andrew Whitechapel post collegato nell'altra risposta mostra come utilizzare questa funzione.

Un altro collegamento - http://blogs.officezealot.com/whitechapel/archive/2005/04/10/4514.aspx.