2010-07-13 4 views
1

Salut tout le monde, j'ai lu à propos de beaucoup de gens qu'il est difficile de fermer les instances d'une application Excel exécutée en utilisant des objets Com. J'ai réussi sporadiquement à fermer complètement les instances d'Excel, mais pas tout le temps (j'y reviendrai plus tard).Microsoft Interop Excel fermeture des instances en cours d'exécution d'Excel?


Mon problème est un peu plus complexe que la simple fermeture d'une instance en cours d'exécution d'Excel que je suis en train de créer une application qui:

  1. Créer un fichier Excel à l'aide d'un des nombreux modèles disponibles (cela fonctionne bien)

  2. cellules POPULATE du modèle en fonction des critères sélectionnés dans mon application (fonctionne aussi très bien)

  3. Permet aux utilisateurs de continuer à saisir des valeurs qui ne peuvent pas être dérivées des données de mon application (voici ce qui rend plus difficile la fermeture des processus et la suppression des objets com)

  4. Sauvegardez les données à la fermeture d'Excel (cela peut fonctionner sans avoir à nettoyer le Cependant, cela signifie évidemment que le processus Excel n'a pas été terminé, j'ai essayé de nettoyer les références d'objets COM, mais il ne me permettra pas d'enregistrer la feuille de calcul APRÈS la fermeture de l'utilisateur, ou pas.

  5. Idéalement, je voudrais terminer le processus Excel lorsque l'utilisateur ferme Excel. (Voici où le problème est) En ce qui concerne le nettoyage de l'objet com


, j'ai une méthode de nettoyage, comme suit:

private void cleanUp() 
{ 
    for (int i = 0; i < ranges.Count; i++) 
    { 
     ranges[i] = null; 
    } 

    for(int i = 0; i < worksheets.Count; i++) 
    { 
     worksheets[i] = null; 
    } 

    for (int i = 0; i < worksheetwrappers.Count; i++) 
    { 
     worksheetwrappers[i] = null; 
    } 
    for (int i = 0; i < workbooks.Count; i++) 
    { 
     while (System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks[i]) > 0) 
       { 
      workbooks[i].Close(false, "", false); 
         workbooks[i] = null; 
       } 
    } 
    for (int i = 0; i < instances.Count; i++) 
    { 
       while (System.Runtime.InteropServices.Marshal.ReleaseComObject(instances[i]) > 0) 
       { 
        instances[i].Quit(); 
         instances[i] = null; 
       } 
     } 
} 

Je n'ai pas encore refactorisons cela et le rendre bien et bien rangé, malheureusement, vous obtenez les bases mêmes de ce que j'ai atm.


Fondamentalement, mon problème est de savoir quand de disposer de tous les objets com et quand effectuer le nettoyage que l'utilisateur doit entrer plus de données après la feuille de calcul a été peuplée, ce qui signifie que je ne peux pas effectuer automatiquement un nettoyage après que la feuille de calcul a été remplie. Je me demande si je devrais utiliser un observateur quelconque pour écouter quand Excel se ferme et puis se débarrasser de tous les objets Com (ce qui est une douleur) ou si quelqu'un a une idée intelligente que je n'ai pas pensé.

Merci pour toute aide,

Nic

Répondre

1

Vous pouvez essayer de contourner votre problème.

1: Créer feuille de calcul basée sur le modèle et peupleront les données

2: processus de démarrage Excel avec le paramètre "newfilename"

3: Attendre processus pour mettre fin à

4: feuille de calcul ouverte, lire données et disposer des objets

Peut-être que c'est une option - vous saurez au moins quand l'utilisateur a terminé sa session Excel.

+0

Vous légende, Fonctionne en combinaison avec l'utilisation d'une méthode de nettoyage différente: D! – user389981

+0

@riffnl pouvez-vous s'il vous plaît inclure votre code, cela a été super frustrantnig pour moi –

+0

@ I___ Je n'ai pas de code pour cela. Je n'ai pas réellement fait la solution pour cela. La question originale était en fait: "Je veux savoir quand l'utilisateur a fini ma session Excel". C'est ce que j'ai suggéré, utilisez le processus et attendez qu'il se termine (voir: http://support.microsoft.com/kb/305369). – riffnl

Questions connexes