Comment fermer Excel ? [Résolu]

cs_bibicool 81 Messages postés lundi 6 septembre 2004Date d'inscription 7 février 2007 Dernière intervention - 2 août 2006 à 13:13 - Dernière réponse : cudenetf 449 Messages postés mardi 20 septembre 2005Date d'inscription 26 juillet 2012 Dernière intervention
- 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 

10 réponses

Répondre au sujet
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 2 août 2006 à 14:29
+3
Utile
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# 
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de MorpionMx
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 2 août 2006 à 13:30
0
Utile
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
cs_bibicool 81 Messages postés lundi 6 septembre 2004Date d'inscription 7 février 2007 Dernière intervention - 2 août 2006 à 13:46
0
Utile
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
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 2 août 2006 à 14:03
0
Utile
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
cs_bibicool 81 Messages postés lundi 6 septembre 2004Date d'inscription 7 février 2007 Dernière intervention - 2 août 2006 à 14:21
0
Utile
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
cs_bibicool 81 Messages postés lundi 6 septembre 2004Date d'inscription 7 février 2007 Dernière intervention - 2 août 2006 à 14:26
0
Utile
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
cs_bibicool 81 Messages postés lundi 6 septembre 2004Date d'inscription 7 février 2007 Dernière intervention - 2 août 2006 à 14:37
0
Utile
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
cs_bibicool 81 Messages postés lundi 6 septembre 2004Date d'inscription 7 février 2007 Dernière intervention - 2 août 2006 à 14:41
0
Utile
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
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 15 août 2006 à 11:15
0
Utile
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
cudenetf 449 Messages postés mardi 20 septembre 2005Date d'inscription 26 juillet 2012 Dernière intervention - 14 juin 2010 à 08:00
0
Utile
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.