11
votes

Obtenir une instance d'application Excel avec C # par la poignée

J'ai une application simple C # qui doit écrire certaines valeurs dans une gamme Excel d'une feuille de calcul spécifique. Je crée une instance d'application Excel s'il n'existe pas, mais si vous souhaitez que j'existerais, je souhaite définir l'actif et prendre une instance s'il utilise dans mon code.

J'utilise ce code pour créer une nouvelle application: P> XXX PRE>

Pour obtenir la poignée de la fenêtre Excel active J'utilise cette API P>

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


0 commentaires

3 Réponses :


22
votes

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

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


2 commentaires

Pour moi, instance = nouveau Excel.ApplicationClass (); n'a pas fonctionné. J'ai dû utiliser instance = nouvelle excellente.application (); .


@Davidmurdoch C'est le résultat d'un Modification de VS2010 pour l'intégration des types Interop . Passer à Application () Over ApplicationClass () est une solution de contournement, vous obtenez le même résultat (même s'il semble que vous instanciant une interface!).



2
votes

Vous pouvez utiliser Marshal.getacerObject, voir ce blog Publier pour plus de détails:

http : //blogs.msdn.com/andreww/archive/2008/11/30/Starting-or-connecting-a-office-apps.aspx


0 commentaires

14
votes

Il pourrait y avoir plus d'une instance Excel en cours d'exécution.

getactiveObject (...) regarde dans la table d'objet en marche (pourrir) et vous donnerait la dernière instance Excel ouverte - pas nécessairement celle correspondant avec la poignée de la fenêtre que vous avez.

Vous recherchez accessibleObjectFromwindow (..). Andrew Whitechapel La publication liée à l'autre réponse montre comment utiliser cette fonction.

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


1 commentaires

Les liens sont cassés.