2011-02-25 44 views
5

我遇到的問題是在.net中使用interop和office excel。我已經嘗試了很多東西來關閉我在程序中使用的excel應用程序,工作簿和工作表,但我總是注意到excel.exe仍然在內存中。我甚至試圖強制垃圾收集器,請幫助。在.net中正確關閉excel互操作應用程序問題

這裏是我用來實例一切代碼:

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

您是否嘗試過'爲mExcelApp.Workbooks中的每本書:book.saved = true:next'? – 2011-02-25 09:43:59

回答

5

基本思想是爲每個創建的COM對象調用Marshal.ReleaseComObject。

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

非常感謝justin,這完全爲我工作。現在我知道如何處理非託管com對象。 – 2011-02-25 15:46:42

+0

樂意幫忙,祝你好運! – 2011-02-25 15:58:28

2

由於Excel應用程序是一個託管COM對象,回收的管理內存可能無法正常工作。我用

Marshal.ReleaseComObject(mExcelApp); 

取得了一些成功。

+0

我會嘗試那個。非常感謝 – 2011-02-25 09:51:03