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 :

[C#] [Excel] Liberer le processus [FAQ]


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti

    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Par défaut [C#] [Excel] Liberer le processus
    Bonjour a tous et merci a tout ceux qui pourront m';aider
    Voici mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private string path;
    		private Excel._Application xlsApp;
    		private Excel._Workbook xlsBook;
    		private Excel._Worksheet xlsSheet;
    		private Excel.Sheets xlsFeuilles;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    xlsApp = new Excel.ApplicationClass();
    			xlsBook = xlsApp.Workbooks.Open(path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);
    			xlsFeuilles = xlsBook.Sheets;
    			xlsSheet = (Excel.Worksheet)(xlsFeuilles[1]);
    Et pour fermer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    xlsApp.Quit();
    			xlsApp = null;
    			xlsBook = null;
    			xlsSheet = null;
    			xlsFeuilles = null;
    Mais ca me termine pas mon processes et pour ouvrir le fichier excel en question, je suis oblige de quitter l'appli!!!

    Une idee???

    [Tag [C#] corrigé par freegreg - Ancien tag : [Excel - C#] ]
    [Pensez-y, vous-même, la prochaine fois. Merci ]

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    J'ai le même problème mais pour Word et je ne sais pas pourquoi cela fait cela (car j'ai bien le .Exit())

    Si tu trouve, cela m'interesse.

  3. #3
    Membre averti

    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Par défaut
    Ah, si un membre eclairee ne trouve pas, ca doit pas etre une question si bete alors 8)
    Je me sens deja mieux Mais j';ai toujours pas la reponse

    Bizarre car en mettant a null tout les objects, ca devrait liberer le processus...
    Je sais comment faire pour tuer un processus Excel, mais je prefere pas cette solution: si le user a 5 fichiers Excel, lui tuer toutes ses ressources risque de l'enerver quelque peu

  4. #4
    Membre averti

    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Par défaut
    Ben pas tres chanceux sur ce sujet...
    ca inspire personne???
    Impossible que nous soyons les 1ers a decouvrir ce probleme! :

  5. #5
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 2
    Par défaut
    salut
    voila une fonction que j'ai ecrite...elle va recherche les noms des feuilles dans un fichier Excell, voila comment je ferme excell...
    si ca peut t'aider..

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    public void GetNames(string file, ListBox lBox)
    		{
    			Excel.Application ExcelObj = null;
    			Excel._Workbook xlClasseur = null;	
     
    			try
    			{
    				ExcelObj = new Excel.Application();
    				ExcelObj.Visible = false;
    			}
    			catch (Exception exc) 
    			{
    				MessageBox.Show(m_ResourceManager.GetString("ExcelError")+" "+exc.Message);
    			}
    			try
    			{
    				object M = Missing.Value;
    				xlClasseur = ExcelObj.Workbooks.Open(file, M, M, M, M, M, M, M, M, M, M, M, M);
    				Excel.Sheets xlFeuilles = xlClasseur.Sheets;
     
    				foreach (Excel._Worksheet xlWS in ExcelObj.ActiveWorkbook.Worksheets) lBox.Items.Add(xlWS.Name);
    				xlClasseur.Close(false, null, null); xlClasseur = null;
    				ExcelObj.Quit(); ExcelObj = null;
    			}
    			catch (Exception exc) 
    			{
    				MessageBox.Show(m_ResourceManager.GetString("ExcelErrorFile")+" "+exc.Message);
    				xlClasseur.Close(false, null, null); xlClasseur = null;
    				ExcelObj.Quit(); ExcelObj = null;
    			}
     
    		}

  6. #6
    Membre averti

    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Par défaut
    Merci pour ca .... mais ca marche toujours pas...

  7. #7
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut
    Salut j'ai tenté le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private string path; 
    private Excel._Application xlsApp; 
    private Excel._Workbook xlsBook; 
    private Excel._Worksheet xlsSheet; 
    private Excel.Sheets xlsFeuilles;
    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
    18
    19
     
    private void button1_Click(object sender, System.EventArgs e)
    		{
    			path = "E:\\Classeur1.xls";
    			xlsApp = new Excel.ApplicationClass(); 
    			xlsBook = xlsApp.Workbooks.Open(path, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); 
    			xlsFeuilles = xlsBook.Sheets; 
    			xlsSheet = (Excel.Worksheet)(xlsFeuilles[1]);
    		}
     
    		private void button2_Click(object sender, System.EventArgs e)
    		{
    			xlsApp.Quit();
    			xlsApp = null; 
    			xlsBook = null; 
    			xlsFeuilles=null;
    			xlsSheet = null; 
    			GC.Collect();
    		}
    Le seul rajout c'est GC.Collect(); : en fait juste forcer Garbage Collector à passer sur toutes les générations.
    Et hop chez moi Excel.exe disparait des Processes dans le Task Manager.

    En espérant vous avoir un peu aidé !

  8. #8
    Membre averti

    Inscrit en
    Novembre 2002
    Messages
    50
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 50
    Par défaut
    AH AH AH

    Merci beaucoup, tu es un(e) genie!!!
    Je peut donc allez au pub now
    Tu viens de sauver my day!

    @+
    ... et merci encore!

  9. #9
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut
    De rien avec plaisir !!

    La bud du pub était bien fraîche !!

  10. #10
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Merci pour moi aussi

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 10
    Par défaut
    Bonjour,

    J'ai essayé ce code dans mon appli, mais chez moi ca ne fonctionne pas, excel tourne toujours derrière meme en rajoutant "GC.Collect();" dans mon code;

    La seule différence avec votre code est que je met le code de fermeture d'excel a la fin de ma procédure d'export dans excel et non pas dans un bouton a part comme vs le faites.

    Voici mon code :

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    object Missing = System.Reflection.Missing.Value;	
     
    Excel.Application xlApp;
    Excel._Workbook xlClasseur;
    Excel._Worksheet xlFeuil1;
     
    xlApp = new Excel.Application();   		
    xlApp.Visible = false;
     
    xlClasseur = xlApp.Workbooks.Add(fileName);
     
     
    xlClasseur = xlApp.Workbooks.Open(fileName,Missing,Missing,Missing,Missing,Missing,Missing,Missing,Missing,Missing,Missing,Missing,Missing);
     
    Excel.Sheets xlFeuilles = xlClasseur.Sheets;
    xlFeuil1 = (Excel._Worksheet)xlFeuilles["Resultat"];  
     
    ....
     
     
    xlClasseur.Save();
     
    xlApp.Quit();
    xlApp = null;
    xlClasseur = null;
    xlFeuil1 = null;
    xlFeuilles = null;
    GC.Collect();
    Comment ca se fait que ca ne fonctionne pas avec ce code ?

    Titoune

  12. #12
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut
    Désolé mais je fais plus de C# je suis en PL/SQL, donc je peux faire aucun test

    SORRY, mais kk1 vas bien t'aider hein les gars ??


    Sinon test avec le code que j'avais fournit à l'"époque et voit si il tourne correctement chez toi.

    Si il fonctionne normalement, tente de mettre dans une procedure.

    Mais je suis désolé je vois pas et peu pas t'aider !

  13. #13
    Membre éclairé
    Inscrit en
    Décembre 2003
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 56
    Par défaut
    Bonjour,
    normalement pour libérer un objet COM il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    System.Runtime.InteropServices.Marshal.ReleaseComObject(Objet);
    Objet = null;
    ReleaseComObject décrémente le compteur de références sur l'objet COM. Si ce compteur vaut 0, l'objet est détruit en principe.

  14. #14
    Membre averti
    Inscrit en
    Mai 2003
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 14
    Par défaut
    Bonjour,

    J'utilise l'objet COM d'Excel pour modifier un fichier. J'ai vu qu evous aviez tous des problémes pour tuer les processus Excel. j'ai testé votre methode et les processus sont toujours ouverts.

    Voici mon code :
    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
    18
    19
    20
    21
    22
    23
    24
    25
     
     string strFileLocation=ConfigurationSettings.AppSettings["FileLocation"];
     
                Excel.Application excelApp=new Excel.Application();// ApplicationClass();
                excelApp.DisplayAlerts=false;
                excelApp.Visible=false;
     
                Excel.Workbook oBook = excelApp.Workbooks.Open(@strFileLocation,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                    Type.Missing, Type.Missing);
     
                Excel._Worksheet oSheet= (Excel.Worksheet)oBook.Sheets["Act_sem"];
                Excel.Range dataField =oSheet.get_Range("nom_prenom",Type.Missing);
                dataField.Value2="fred aster";
     
                oBook.Save();
                oBook.Close(false,Type.Missing,Type.Missing);
                excelApp.Quit();
                excelApp=null;
                oBook=null;
                oSheet=null;
     
                GC.Collect();
    Merci pour les pistes (si vous en avez)

  15. #15
    Membre émérite

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 734
    Par défaut
    Bonjour je remet au gout du jour ce post,
    comme certains posteurs(ses) j(ai aussi le probleme des processus excel qui ne veulent pas quitter la scene du taskmanager.
    mais j'en aussi un autre, excel plante a la suite d'un fonction ou j'utilise excel avec un
    "erreur application excel.exe, la memoire "une adresse hexa" ne peut être read"
    enfin un truc de ce genre là.
    je suis VB.NET 2003.

    edit : j'ai trouve ceci sur msdn : http://support.microsoft.com/kb/317109/fr
    mais le plantage d'excel demeure, sinon la solution fonctionne
    moah, avait bien trouvé.

    edit2: j'ai résolu mon probleme de plantage, il venait du fait que je faisais wb.close(false), cette ligne me faisait planter excel. en la supprimer ce la fonctionne, ou en la remplacant par wb.close().(wb etant un workbook).
    quant au code donnait ci-dessus il marche a merveille.

  16. #16
    Membre émérite

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 734
    Par défaut
    j'ai trouver un atreu moyen que celui donner par microsoft. mais c'est un moyen (voir meme très)barbare. et bien que ce matin je croyais avoir trouvé ma solution a mon problème de plantage d'excel après utilisation. il s'est avéré cet après-midi que la solution de microsoft semble fonctionnait dans les cas simples, ce n'est qu'a moitié le cas dans les cas par exemple d'accès au code VBA d'une appli(en tout cas c'est apres l'execution d'une telle procédure que ca plante). en effet 1/2 j'ai une erreur venant d'excel(toujours apres l'execution d'une procédure) malgré le code de MS.
    alors voici le moyen barbare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Public Sub tuerexcel()
            Dim exs As System.Diagnostics.Process()
            Dim ex As System.Diagnostics.Process
            exs = System.Diagnostics.Process.GetProcessesByName("Excel")
            For Each ex In exs
                ex.Kill()
            Next
        End Sub
    comme vous les voyez c'est barbare et pas tres "bon". mais comme je vous l'ai dit pour moi il n'y a pas d'autre moi.[/url]

  17. #17
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Par défaut
    J'ai actuellement le meme problème avec ce *^$%µ d'Excel.

    Il ouvre 1 processus Excel pour chaque Application.

    J'ai essayé les méthodes dites précédemment et dès que je ferme excel ca plante avec une erreur de lecture mémoire.





    ps : pourquoi la balise [FAQ] ? dans la FAQ DotNet j'ai rien vu concernant ce sujet. Autre faq ?

    edit 1 : pour les processus ?

    edit 2 : apparemment le fait de faire un xlApp = Nothing faisait planter la chose. Ca me reloute cette gestion d'Excel et des COM en général

    INSERT INTO MICROSOFT (SELECT * FROM TABLE_INSULTES)

  18. #18
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Citation Envoyé par SoaB
    ps : pourquoi la balise [FAQ] ? dans la FAQ DotNet j'ai rien vu concernant ce sujet. Autre faq ?
    pour nous faire penser à le rajouter justement

  19. #19
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 310
    Par défaut
    ah oki

  20. #20
    Membre émérite

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    734
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 734
    Par défaut
    Citation Envoyé par SoaB
    J'ai actuellement le meme problème avec ce *^$%µ d'Excel.

    Il ouvre 1 processus Excel pour chaque Application.

    J'ai essayé les méthodes dites précédemment et dès que je ferme excel ca plante avec une erreur de lecture mémoire.





    ps : pourquoi la balise [FAQ] ? dans la FAQ DotNet j'ai rien vu concernant ce sujet. Autre faq ?

    edit 1 : pour les processus ?

    edit 2 : apparemment le fait de faire un xlApp = Nothing faisait planter la chose. Ca me reloute cette gestion d'Excel et des COM en général

    INSERT INTO MICROSOFT (SELECT * FROM TABLE_INSULTES)
    j'ai eu le meme probleme lors du dev de mon application qui user excel. c'était tout bonement incomprehensible. excel ne planté pendant son traitement(qui lister les macro presente dans un fichier excel) et a la fin de la procedure qui appele cete fonction j'avais de temps a autres ce probleme de memoir qui ne pouvait être "read". alors je me suis dit je vais killer ce prossuse apres avoir user des moyens "legaux pour l'arreter.
    donner sur ce forum et sur mdsn et enfin pour terminator de excel que j'ai poste au dessus.

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

Discussions similaires

  1. Application Excel - Tuer le processus EXCEL.EXE?
    Par xVINCEx dans le forum VB.NET
    Réponses: 21
    Dernier message: 18/04/2012, 10h43
  2. Excel, fin du processus
    Par MelleMariel dans le forum C#
    Réponses: 2
    Dernier message: 25/06/2007, 12h45
  3. [VBA-A]pb ouvrir processus excel
    Par JulienCEA dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 07/02/2006, 10h50
  4. processus excel
    Par CharleLéo dans le forum Langage
    Réponses: 4
    Dernier message: 25/10/2005, 11h49

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