2009-07-13 4 views
7

J'ai une simple application C# qui doit écrire des valeurs dans une plage excel d'une feuille de calcul spécifique. Je crée une instance d'application Excel si elle n'existe pas, mais si elle existe, je veux l'activer et prendre une instance si elle doit l'utiliser dans mon code.Récupère l'instance de l'application Excel avec C# par Handle

J'utiliser ce code pour créer une nouvelle application:

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

Pour obtenir la poignée de la fenêtre Excel actif i utilise cette api

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

Comment puis-je obtenir une instance d'application Excel par une poignée?

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

Répondre

16

Utilisez le code suivant pour obtenir la première instance en cours d'exécution d'Excel:

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

Exemple

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

Pour moi, 'instance = new Excel.ApplicationClass();' n'a pas fonctionné. J'ai dû utiliser 'instance = new Excel.Application();'. –

+2

@DavidMurdoch ceci est le résultat d'un [changement de VS2010 pour l'intégration des types d'interopérabilité] (http://blogs.msdn.com/b/mshneer/archive/2009/12/07/interop-type-xxx-cannot-be -embedded-use-the-applicable-interface-à la place.aspx). Passer à 'Application()' sur 'ApplicationClass()' est une solution de contournement, vous obtenez le même résultat (même s'il semble que vous instanciez une interface!). – James

13

Plusieurs instances Excel peuvent être en cours d'exécution. GetActiveObject (...) regarde dans la table des objets courants (ROT) et vous donnerait la dernière instance Excel qui a été ouverte - pas nécessairement celle correspondant au handle de fenêtre que vous avez.

Vous recherchez AccessibleObjectFromWindow (..). Le Andrew Whitechapel post lié à dans l'autre réponse montre comment utiliser cette fonction.

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

Questions connexes