2011-02-25 2 views
5

Je rencontre des problèmes en utilisant interop avec Office Excel dans. NET. J'ai essayé beaucoup de choses pour fermer l'application, le classeur et les feuilles de travail d'Excel que je crée pour employer dans mon programme mais je remarque toujours le excel.exe toujours dans la mémoire. J'ai même essayé de forcer le ramasse-miettes, aidez s'il vous plaît.Problème de fermeture de l'application interop excel correctement .net

Voici le code que j'utilise pour instancier tout:

Private mExcelApp As Microsoft.Office.Interop.Excel.ApplicationClass 
Private mWorkBook As Microsoft.Office.Interop.Excel.Workbook 
Private mWorkSheet As Microsoft.Office.Interop.Excel.Worksheet 


    Public Sub Execute() 

    mExcelApp = New Microsoft.Office.Interop.Excel.ApplicationClass 
    If mFirstPass Then 
     mWorkBook = mExcelApp.Workbooks.Add() 
     mWorkSheet = CType(mWorkBook.ActiveSheet(), Microsoft.Office.Interop.Excel.Worksheet) 
    Else 
     mWorkBook = mExcelApp.Workbooks.Open(System.IO.Path.Combine(mFileLocation, mMTDefinition.Description & "_" & mMTDefinition.Version & ".xls")) 
     mWorkSheet = CType(mWorkBook.Sheets(1), Microsoft.Office.Interop.Excel.Worksheet) 
     Dim excelRange As Microsoft.Office.Interop.Excel.Range = mWorkSheet.UsedRange 
     excelRange.SpecialCells(Microsoft.Office.Interop.Excel.XlCellType.xlCellTypeLastCell).Activate() 
     mCurrentRow = mExcelApp.ActiveCell.Row + 1 

    End If 

    Here is how i try to close everything 

    If mFirstPass Then 
     mWorkBook.SaveAs(System.IO.Path.Combine(mFileLocation, mMTDefinition.Description & "_" & mMTDefinition.Version & ".xls")) 
     mFirstPass = False 
     Else 
     mWorkBook.Save() 
    End If 
     a 
    mWorkBook.Close() 
    mExcelApp.Quit() 

    mWorkSheet = Nothing 
    mWorkBook = Nothing 
    mExcelApp = Nothing 
    System.GC.Collect() 
+0

avez-vous essayé 'pour chaque livre dans mExcelApp.Workbooks: book.saved = true: next'? –

Répondre

5

L'idée de base est d'appeler Marshal.ReleaseComObject pour chaque objet COM créé.

Dim app As New Excel.Application() 
    Dim workBook As Excel.Workbook = app.Workbooks.Add() 
    Try 

     Dim t As Int32 = 0 
     ' This example is filling an excel spreadsheet using data stored in a Dictionary 
     For Each key In sampleData.Keys 
      t += 1 
      ' Add a worksheet and dump data. 
      Dim sheet As Excel.Worksheet = workBook.Worksheets.Add() 
      sheet.Name = key 

      ' Set columns 
      For i = 1 To sampleData(key).Columns.Count 
       sheet.Cells(1, i) = sampleData(key).Columns(i - 1).ColumnName 
      Next 

      ' Set data. 
      For r = 1 To sampleData(key).Rows.Count 
       For c = 1 To sampleData(key).Columns.Count 
        sheet.Cells(r + 1, c) = sampleData(key).Rows(r - 1).Item(c - 1).ToString() 
       Next c 
      Next r 
      Marshal.ReleaseComObject(sheet) 
     Next 

     workBook.SaveAs("fileName.xls", Excel.XlFileFormat.xlExcel8) 
     workBook.Close(SaveChanges:=False) 

    Finally 
     app.Quit() 
     Marshal.ReleaseComObject(workbook) 
     Marshal.ReleaseComObject(app) 
     app = Nothing 
    End Try 
+0

Merci beaucoup Justin, cela a totalement fonctionné pour moi. Maintenant, je sais comment gérer les objets com non gérés. –

+0

Heureux d'aider, bonne chance! –

2

Comme l'application Excel est un objet COM non géré, récupérer la mémoire gérée pourrait ne pas fonctionner. J'ai utilisé

Marshal.ReleaseComObject(mExcelApp); 

avec un certain succès.

+0

Je vais essayer celui-là. Merci beaucoup –