2009-08-27 9 views
3

Je dois terminer une application en C#. Maintenant, je veux obtenir une fonction qui contrôle un fichier Excel pour obtenir des données. J'ai utilisé getActiveObject ("Excel.Application"), mais cela ne retourne rien. Et plus, je ne peux pas utiliser Excel.Application dans VS2008, et Microsoft.Office.Interop.Excel.Application est à la place. Alors, y a-t-il un autre moyen d'obtenir ce que je veux?Comment utiliser getActiveObject ("Excel.Application")

Microsoft.Office.Interop.Excel.Application e = (Microsoft.Office.Interop.Excel.Application) Marshal.GetActiveObject ("Excel.Application");

Répondre

0

Afin de pouvoir se référer au modèle d'objet Excel « Excel », vous pouvez créer un alias via une déclaration using en haut de votre espace de noms (ou document) comme suit:

using Excel = Microsoft.Office.Interop.Excel; 

Par la suite, vous pouvez vous référer à Excel.Application au lieu du long Microsoft.Office.Interop.Excel.Application. En ce qui concerne les raisons de l'échec de votre appel à Marshal.GetActiveObject, je ne peux pas vous le garantir. Quelques réflexions:

(1) Êtes-vous certain qu'une instance d'Excel est déjà présente? Sinon, créez une nouvelle application Excel:

Excel.Application xlApp = new Excel.Application(); 

(2) S'il y a certainement une application Excel déjà en cours d'exécution, il est possible que l'instance Excel n'a pas encore été ajouté à la course Objets Table (ROT) si l'application Excel n'a jamais perdu le focus. Voir: Visual C# .NET Error Attaching to Running Instance of Office Application pour plus à ce sujet. Je crois que la méthode Marshal.GetActiveObject devrait lancer une exception dans ce cas - pas tranquillement retourner null - mais cela semble toujours potentiellement pertinent.

J'espère que cette aide ...

Mike

2

Après environ une demi-journée de jouer autour j'ai finalement compris comment faire ce travail afin que vous puissiez accrocher une copie ouverte d'Excel. Mes utilisateurs se sont plaints puissamment d'avoir trop d'instances d'Excel ouvertes.

Voici un extrait de ce que je l'ai fait pour le faire fonctionner:

_Application excelApp; 

try 
{ 
    excelApp = (_Application)Marshal.GetActiveObject("Excel.Application"); 
} 
catch(Exception) 
{ 
    // this is important. If Excel is not running, GetActiveObject will throw 
    // an exception 
    excelApp = null; 
} 

if(excelApp == null) 
{ 
    excelApp = new ApplicationClass(); 
} 

Je suis poursuivais pendant un certain temps et enfin eu un peu de temps à courber l'échine et le comprendre.

+0

Je suis en train de faire la même chose avec un objet ActiveQt et une enveloppe C++/CLI Form. Je pense que le code C# sera très proche de ce dont j'ai besoin. Merci. – jetimms