cs_bibicool
Messages postés81Date d'inscriptionlundi 6 septembre 2004StatutMembreDernière intervention 7 février 2007
-
2 août 2006 à 13:13
cudenetf
Messages postés448Date d'inscriptionmardi 20 septembre 2005StatutMembreDernière intervention26 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.
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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é
MorpionMx
Messages postés3466Date d'inscriptionlundi 16 octobre 2000StatutMembreDernière intervention30 octobre 200857 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.
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...
cs_bibicool
Messages postés81Date d'inscriptionlundi 6 septembre 2004StatutMembreDernière intervention 7 février 20071 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.
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,
// 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();
cs_bibicool
Messages postés81Date d'inscriptionlundi 6 septembre 2004StatutMembreDernière intervention 7 février 20071 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 !
cs_bibicool
Messages postés81Date d'inscriptionlundi 6 septembre 2004StatutMembreDernière intervention 7 février 20071 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 !
cs_bibicool
Messages postés81Date d'inscriptionlundi 6 septembre 2004StatutMembreDernière intervention 7 février 20071 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 ;-)