2017-07-26 1 views
0

J'ai développé une application Winform lisant depuis Excel et la transformant en fichiers texte. J'ai utilisé la bibliothèque Microsoft.Office.Interop.Excel afin de travailler avec Excel.Désactiver le cache de l'application Winform

Voici mon code:

private Excel.Application excel = null; 
     private Excel.Sheets sheets = null; 
     private Excel.Workbook excelWorkbook = null; 
     private Excel.Workbooks excelWorkbooks = null; 
     private Excel._Worksheet worksheet = null; 
     private Excel.Range usedRange = null;  

     public ExcelFacade() { } 

     public ExcelFacade(string fileName) 
     { 
      excel = new Excel.Application(); 

      excelWorkbooks = excel.Workbooks; 
      excelWorkbook = excelWorkbooks.Open(fileName, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 
      sheets = excelWorkbook.Sheets; 
     } 

Après avoir terminé le travail avec Excel j'appeler la méthode suivante (à partir here):

public void Dispose() 
     { 


      foreach (Microsoft.Office.Interop.Excel.Worksheet sheet in sheets) 
      { 
       while (Marshal.ReleaseComObject(sheet) != 0) { } 
      } 

      excelWorkbook.Close(); 
      excelWorkbooks.Close(); 
      excel.Quit(); 

      var chromeDriverProcesses = Process.GetProcesses(). 
         Where(pr => pr.ProcessName.ToLower().Contains("excel")); 
      foreach (var process in chromeDriverProcesses) 
      { 
       process.Kill(); 
      } 


      //while (Marshal.ReleaseComObject(usedRange) != 0) { } 
      //while (Marshal.ReleaseComObject(worksheet) != 0) { } 
      while (Marshal.ReleaseComObject(sheets) != 0) { } 
      while (Marshal.ReleaseComObject(excelWorkbook) != 0) { } 
      while (Marshal.ReleaseComObject(excelWorkbooks) != 0) { } 
      //while (Marshal.ReleaseComObject(excel.Application) != 0) 
      //{ } 
      while (Marshal.ReleaseComObject(excel) != 0) { }   
      usedRange = null; 
      worksheet = null; 
      excelWorkbook = null; 
      excelWorkbooks = null; 
      sheets = null; 
      excel = null; 

      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 
      GC.Collect(); 
      GC.WaitForPendingFinalizers(); 

     } 
    } 

Cependant, si je change Excel et relancer ma demande, la mis à jour Excel n'est pas pris par l'application et il semble qu'il lue à partir de vieux Excel. Un tel comportement ressemble à une mise en cache et je ne sais pas comment le désactiver.

Ce qui précède est renforcé par le fait que si je change quelque chose dans mon code, par ex. espace blanc, et reconstruire l'application, cela fonctionne génial et prendre le bon fichier Excel. Des suggestions?

+1

Je ne l'ai pas utilisé Interop beaucoup, donc je ne suis pas sûr que je peux répondre directement à votre question - mais serait-il possible pour vous d'utiliser une bibliothèque comme ClosedXML à la place? Ou si c'est pour les fichiers XLS, pourriez-vous utiliser OLE? L'un ou l'autre éviterait complètement votre problème. – vbnet3d

Répondre

0

Comme @ vbnet3d dit, en utilisant la bibliothèque ClosedXML résout tous les problèmes