Comment fermer Excel ? [Résolu]

Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Dernière intervention
7 février 2007
- - Dernière réponse : cudenetf
Messages postés
449
Date d'inscription
mardi 20 septembre 2005
Dernière intervention
26 juillet 2012
- 14 juin 2010 à 08:00
Bonjour à tous,

Je crée un programmen en C# qui m'ouvre un fichier excel présent sur la machine, lui ajoute des données tirées d'une base de donnée sqlserver et ensuite j'aimerais refermer Excel.

J'utilise ce code

excelWorkbook.Close(

false,0,
false); //ferme les workbook sans les sauvegarder (déjà fait)excelApp.Quit(); // ferme Excel

Tout semble parfait mais si je regarde dans le task manager il me reste néanmoins un process Excel.exe ouvert.
Si je lance plusieurs fois l'application, j'en ai plusieurs instance... toutes me prenant plus ou moins 15Mo de Ram... mon PC finit par saturer.

Comment faire pour correctement fermer Excel ?

Merci

Bibicool
Afficher la suite 

Votre réponse

10 réponses

Meilleure réponse
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
3
Merci
Ce code, c'est juste pour te montrer un code basique d'ouverture et de fermeture d'application excel

Le finally est la pour t'assurer de liberer les ressources quoiqu'il se passe dans ton try/catch.
En effet, si une instruction dans ton try plante, ton catch prend le relai, donc tes documents ne seront pas fermés, la mémoire pas liberée.
Si tu mets ces instructions critiques dans le finally, que ton try aille jusqu'au bout, ou qu'il y ait une levée d'exception, la liberation des ressources se fera.

Donc maintenant, tu n'as plus qu'a faire ce que tu faisais precedemment, mais en ajoutant la clause finally comme je te l'ai indiqué

Mx
MVP C# 

Merci MorpionMx 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de MorpionMx
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
0
Merci
Salut
As-tu essayé d'ajouter

System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
excelApp = null;

Es-tu sur que ton code s'appele ? (mis dans une clause finally ? )

Mx
MVP C# 
Commenter la réponse de MorpionMx
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Dernière intervention
7 février 2007
0
Merci
Merci de ta réponse rapide,

J'avais essayé le excelApp = null; sans le code
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);

Je viens de réessayer avec, mais toujours le même problème.

Quand tu demandes si mon code s'appelle tu veux dire est-ce qu'il passe bien dedans ? Heu oui car tout le reste est fait, le fichier est sauvé, il est fermé.
J'ai même mis excelApp.Visible =

true;
afin de voir ce qui se passait exactement.... Mais le service Excel.exe est toujours présent.

vraiment bizarre.

Voici tout mon code si jamais :

Microsoft.Office.Interop.Excel.Application excelApp =

new Microsoft.Office.Interop.Excel.ApplicationClass();
// Creates a new Excel ApplicationexcelApp.Visible =

true;
// Makes Excel invisible to the user.

//This is to convert your sysdem data into Global language.
//It is necessary when your system data in some other Language.
System.Globalization.CultureInfo oldCI = System.Threading.Thread.CurrentThread.CurrentCulture ;
System.Threading.Thread.CurrentThread.CurrentCulture =
new System.Globalization.CultureInfo("en-US");

// The following code opens an existing workbook
string workbookPath = "c:/LSAFTemplate.xls";
// Add your own path hereMicrosoft.Office.Interop.Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(workbookPath, 0,

false, 5, "", "",
false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "",
true,
false, 0,
true,
false,
false);

// The following gets the Worksheets collection
Microsoft.Office.Interop.Excel.Sheets excelSheets = excelWorkbook.Worksheets;

// The following gets LSAF Sheet for editingstring currentSheet "LSAF";Microsoft.Office.Interop.Excel.Worksheet excelWorksheet (Microsoft.Office.Interop.Excel.Worksheet)excelSheets.get_Item(currentSheet);

try{

DataTable dt =

new DataTable();
objDB =
new DB(ConnectionString);

dt = objDB.runQuery(query);

for(
int i = 1 ; i <= dt.Rows.Count ; i++)
{

for(
int j = 1 ; j <= dt.Columns.Count ; j++ )
{

//This is to add the Data which retrieved from the database into your Excel Sheet.
((Microsoft.Office.Interop.Excel.Range)excelWorksheet.Cells[i+17,j+1]).Value2 = dt.Rows[i-1].ItemArray[j-1].ToString();

}

}
System.IO.Directory.CreateDirectory(@"c:\test");
excelWorkbook.SaveCopyAs(@"c:\test\LSAF.xls");
excelWorkbook.Close(

false,0,
false);
excelApp.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
excelApp =
null;

return 1;
}

catch(Exception e1)
{
MessageBox.Show(e1.Message);

return 0;
}

Encore merci de ton aide

Bibicool
Commenter la réponse de cs_bibicool
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
0
Merci
Deplace ton code de fermeture de excelWorkBook et excelApp dans un finally pour que ce soit plus propre (en testant leur valeur pour voir s'il ne sont pas null, et en leur attributant la valeur null ensuite.
Ensuite, appele un GC.Collect();.. Cette solution m'embete, mais au moins elle fonctionne.

Donc en fait :

<hr />ApplicationClass

excelApp =
null;

Workbook excelWorkBook =
null;

try
{
   excelApp =
new
ApplicationClass();
   excelWorkBook = (
Workbook)excelApp.Workbooks.Add(
null);
}

catch{}

finally
{

   if (excelWorkBook !=
null)
   {
      excelWorkBook.Close(
false,
@"c:\coucou.xls",
null);
      System.Runtime.InteropServices.
Marshal.ReleaseComObject(excelWorkBook);
      excelWorkBook =
null;
   }

   if (excelApp !=
null)
   {
        excelApp.Quit();
        System.Runtime.InteropServices.
Marshal.ReleaseComObject(excelApp);
        excelApp =
null;
   }

   GC.Collect();
}

<hr />

Mx
MVP C# 
Commenter la réponse de MorpionMx
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Dernière intervention
7 février 2007
0
Merci
Hello,

C'est la première fois que j'utilise le finaly, je ne connaissais pas, je reprend la programmation après quelques années.

Je me demandais la partie de ton code

ApplicationClass

excelApp =
null;

Workbook excelWorkBook =
null;

try
{
   excelApp =
new
ApplicationClass();
   excelWorkBook = (
Workbook)excelApp.Workbooks.Add(
null);
}

Je dois mettre ca où ?  Est-ce que je dois le mettre ?

Je viens d'ajouter le finally juste après mon catch, avec le Garbage collector, mais ca ne marche toujours pas ... pffffff

Pourtant j'ai trouvé ta solution autrepart sur un autre site et c'est censé fonctionner !

Bibicool
Commenter la réponse de cs_bibicool
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Dernière intervention
7 février 2007
0
Merci
Autre chose qui me semble bizarre... même si je ne sauve rien, donc je dis juste au système d'ouvrir le fichier et d'y mettre les données, ensuite je laisse le soisn à l'utilisateur de fermer le fichier et de sauvegarder... ben même dans ce cas il ne supprime pas le service... vraiment bizarre ce truc !

Bibicool
Commenter la réponse de cs_bibicool
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Dernière intervention
7 février 2007
0
Merci
Cool merci pour l'info... je me demandais justement comment gérer ces sorties par catch !


Yep c'est ce que j'avais essayé... ca règle pas tout à fait le problème mais disons que Je vais laisser ca comme ca.


alors maintenant il me créée tout bien si j'en crée plusieurs de suite... il n'en reste qu'une qui reste active... ET lorsque je quitte le programme il l'a supprime... donc toujours bizarre, mais ca ne posera plus de problème de ressource !


Un tout grand merci

Bibicool
Commenter la réponse de cs_bibicool
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Dernière intervention
7 février 2007
0
Merci
de nouveau moi !


Problème totalement résolu, j'avais mis ma création de fichier excel dans un classe que j'instenciais dans un formulaire... Je supprimais bien mon instance ensuite... il suffisait de mettre le Garbage Collector et hop, dès le travail fini toutes les instances sont bien supprimées.... Un très grand merci... Je viens de faire un solide bon dans mes connaissances ;-)






Bibicool
Commenter la réponse de cs_bibicool
Messages postés
6366
Date d'inscription
samedi 1 juin 2002
Dernière intervention
2 août 2014
0
Merci
Salut,

Si tu veux éviter de faire de l'automation Excel regarde si ceci ne te convient pas : Excel Xml Writer : générer des classeurs Excel ... sans Excel

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
Messages postés
449
Date d'inscription
mardi 20 septembre 2005
Dernière intervention
26 juillet 2012
0
Merci
Bonjour, j'ai un souci similaire...
je prend une feuille excel que je rempli et que je sauve sous un autre nom pour garder l'original vierge

mais quand je regarde le gestionnaire des tache j'ai toujours un service excel qui traine...

voici la fin de ma fonction

Microsoft.Office.Interop.Excel.Application app = null;
Microsoft.Office.Interop.Excel.Workbook classeur = null;
try
{
app = new Microsoft.Office.Interop.Excel.Application();
classeur = app.Workbooks.Open(file_doc_vierge, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing);
//créer feuille
feuille = (Microsoft.Office.Interop.Excel.Worksheet)classeur.Sheets[1];
classeur.SaveAs(file_doc_sav, oMissing, oMissing, oMissing, oMissing, oMissing, XlSaveAsAccessMode.xlShared, oMissing, oMissing, oMissing, oMissing, oMissing);
//classeur.Close(oMissing, oMissing, oMissing);
//app.Workbooks.Close();
//app.ex
}
catch (Exception ex)
{
Class_erreur.erreur(ex.ToString());
}
finally
{
//classeur.Close(oMissing, oMissing, oMissing);
//app.Workbooks.Close();

if (classeur != null)
{
//classeur.Close(oMissing, oMissing, oMissing);
classeur.Close(false,file_doc_vierge, null);
//classeur.Close(false, file_doc_sav, null);
System.Runtime.InteropServices.Marshal.ReleaseComObject(classeur);
classeur = null;
}
if (app != null)
{
app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
app = null;
}
GC.Collect();
}


si je lance plusieurs fois la procedure , il y a un deuxieme excel qui s'ouvre mais il se referme ... au final j'en reste avec un qui fini par disparaitre quand je quitte la fenetre...
Commenter la réponse de cudenetf

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.