IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

Problème d'Interop avec MSExcel


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 14
    Par défaut Problème d'Interop avec MSExcel
    Bonjour,

    Je cherche à exporter des données vers Excel et je rencontre un problème de persistance du process "EXCEL.EXE" malgrés la libération des ressources utilisées.

    Voici le code que j'utilise pour créer le classeur le fichier xls :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim xla As New Excel.Application
            'xla.Visible = True
            Dim xlb As Excel.Workbook = xla.Workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet)
            Dim xls As Excel.Worksheet = xlb.ActiveSheet
     
            xls.Cells(1, 1) = "test"
            xls.SaveAs("C:\temp\test.xls")
     
            xlb.Close(False)
            xls = Nothing
            xlb = Nothing
            xla.Quit()
            xla = Nothing
    Tout se déroule correctement sauf qu'il est impossible ensuite d'ouvrir le fichier xls. Ceci parce que le process Excel tourne toujours sur la machine. Ce process est par ailleurs détruit qu'avec la fermeture de l'application .net. Une fois le process supprimé de cette manière, le classeur xls crée ne pose aucun problème.

    L'application est sous VS2005, Excel est en version 2000 (9.0 -SP3).
    Les références aux Object Library Office et Excel sont bien faîtes dans le projet, les dll bien présentes dans la solution.

    Avez-vous une idée du pourquoi le process Excel continue de fonctionne aprés la libération des ressources associées; Une solution à m'apporter ?

  2. #2
    Rédacteur/Modérateur
    Avatar de Skalp
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2006
    Messages
    1 694
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 694
    Par défaut
    Voilà plusieurs solutions dans l'ordre croissant d'efficacité :

    1. Libérer les références aux objets COM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Runtime.InteropServices.Marshal.ReleaseComObject(monAppli);
    2. Utiliser le Garbage Collector (GC) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GC.Collect();
    GC.WaitForPendingFinalizers();
    Il peut être utile de doubler cette portion, dans le cas où la référence mémoire du process est conservée après le premier appel.

    3. Récupérer l’identifiant du processus office :
    La méthode la plus définitive est de tuer le processus à la fin de l’automation.
    Il faut pour cela, dans un premier temps, récupérer l’identifiant du processus, et le stocker pendant tout le temps que doit durer l’automation. Exemple pour une automation Word :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    int processId = 0;
    // 1. Additionner les identifiants des processus winword avant l’ouverture de l’automation :
    foreach (Process item in Process.GetProcessesByName("winword"))
        processId -= item.Id;
     
    // 2. Ouvrir l’automation :
    ApplicationClass monAppli = new ApplicationClass();
     
    // 3. Ajouter les identifiants des processus winword après l’ouverture de l’automation,
    // la différence (après - avant) donnera l’identifiant du processus ouvert :
    foreach (Process item in Process.GetProcessesByName("winword"))
        processId += item.Id;
     
    // Automation...
     
    // Enfin, lorsque l’automation est terminée, il suffit de tuer le processus à partir de son identifiant :
    Process.GetProcessById(processId).Kill();

    Une FAQ DVPZ.COM traitant de ce problème est en cours de rédaction.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Août 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 14
    Par défaut
    Bonsoir,

    Merci pour toute ces réponses. Entre temps j'avais trouvé la solution du Garbage Collector qui effectivement nécessite systèmatiquement son double passage.
    Et finalement, je me suis mis a générer mes fichiers avec :
    - simplement Computer.FileSystem.OpenTextFileWriter()
    - un contenu html
    - une extension de nom .doc, .xls, .htm, indifféremment ils s'ouvrent sans problème.

    Pour la FAQ, j'irai y jeter un oiel et peut-être des idées.

    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. SQLite & C# : Problème à la compilation avec SQLite.Interop.dll
    Par Naoris dans le forum Accès aux données
    Réponses: 6
    Dernier message: 07/12/2011, 13h46
  2. problème de requête avec jointures
    Par tinhat dans le forum Requêtes
    Réponses: 7
    Dernier message: 11/08/2003, 10h33
  3. Problème dans requête avec count()
    Par BadFox dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/07/2003, 18h02
  4. [Kylix] problème compilation kylix3 avec redhat 9.0
    Par madininaoursa dans le forum EDI
    Réponses: 1
    Dernier message: 02/07/2003, 16h21
  5. Problèmes de versions avec Xalan, Xerces et Java
    Par honeyz dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 05/06/2003, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo