Comment fermer Excel ? [Résolu]

Signaler
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
7 février 2007
-
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
-
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

10 réponses

Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
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# 
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
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# 
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
52
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# 
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
7 février 2007
1
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
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
7 février 2007
1
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
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
7 février 2007
1
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
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
7 février 2007
1
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
Messages postés
81
Date d'inscription
lundi 6 septembre 2004
Statut
Membre
Dernière intervention
7 février 2007
1
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
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
93
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
*/
Messages postés
448
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
26 juillet 2012
1
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...