Comment fermer Excel ?

Résolu
cs_bibicool Messages postés 81 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 7 février 2007 - 2 août 2006 à 13:13
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre 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
A voir également:

10 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
2 août 2006 à 14:29
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# 
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
2 août 2006 à 14:03
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# 
1
cudenetf Messages postés 448 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 26 juillet 2012 2
14 juin 2010 à 08:00
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...
1
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
2 août 2006 à 13:30
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# 
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_bibicool Messages postés 81 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 7 février 2007 1
2 août 2006 à 13:46
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
0
cs_bibicool Messages postés 81 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 7 février 2007 1
2 août 2006 à 14:21
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
0
cs_bibicool Messages postés 81 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 7 février 2007 1
2 août 2006 à 14:26
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
0
cs_bibicool Messages postés 81 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 7 février 2007 1
2 août 2006 à 14:37
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
0
cs_bibicool Messages postés 81 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 7 février 2007 1
2 août 2006 à 14:41
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
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
15 août 2006 à 11:15
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
*/
0
Rejoignez-nous