2009-10-23 80 views
3

以下代碼工作正常,但似乎將excel.exe的實例保留在後臺運行。我如何正確地關閉此子?閱讀vb.net中的excel文件留下excel進程掛起

Private Sub ReadExcel(ByVal childform As Fone_Builder_Delux.frmData, ByVal FileName As String) 
    ' In progress 
    childform.sampleloaded = False 
    Dim xlApp As Excel.Application 
    Dim xlWorkBook As Excel.Workbook 
    Dim xlWorkSheet As Excel.Worksheet 

    xlApp = New Excel.ApplicationClass 
    xlWorkBook = xlApp.Workbooks.Open(FileName) 
    xlWorkSheet = xlWorkBook.Worksheets(1) 
    Dim columnrange = xlWorkSheet.Columns 
    Dim therange = xlWorkSheet.UsedRange 


    childform.datagridHeaders.Columns.Add("", "") ' Super imporant to add a blank column, could improve this 
    For cCnt = 1 To therange.Columns.Count 

     Dim Obj = CType(therange.Cells(1, cCnt), Excel.Range) 
     childform.datagridSample.Columns.Add(Obj.Value, Obj.Value) 
     childform.datagridHeaders.Columns.Add(Obj.Value, Obj.Value) 

    Next 

    For rCnt = 2 To therange.Rows.Count 
     Dim rowArray(therange.Columns.Count) As String 
     For cCnt = 1 To therange.Columns.Count 

      Dim Obj = CType(therange.Cells(rCnt, cCnt), Excel.Range) 
      Dim celltext As String 
      celltext = Obj.Value.ToString 
      rowArray((cCnt - 1)) = celltext 
      'MsgBox(Obj.Value) 

     Next 
     childform.datagridSample.Rows.Add(rowArray) 
    Next 

    AdjustHeaders(childform) 
    childform.sampleloaded = True 
End Sub 
+0

另外:使用xlApp =新的Excel.Application,而不是Excel.ApplicationClass。 ApplicationClass不應該被使用 - 並且無論如何你已經聲明XlApp是一個Excel.Application。 – Mathias 2009-10-25 18:25:44

回答

3

簡答題:適當關閉每個項目,然後撥打FinalReleaseComObject

GC.Collect() 
GC.WaitForPendingFinalizers() 

If xlWorkSheet Is Nothing Then Marshal.FinalReleaseComObject(xlWorkSheet) 
If xlWorkBook Is Nothing Then 
    xlWorkBook.Close(false, false) 
    Marshal.FinalReleaseComObject(xlWorkBook) 
End If 
xlApp.Quit() 
Marshal.FinalReleaseComObject(xlApp) 

龍答:閱讀answer to another question(整個後是有幫助太)。

+1

+1,這是唯一的解決方案I發現的作品。 2個GC是非常重要的 – smirkingman 2014-02-25 09:34:57

0

我就遇到了這個問題,我發現了什麼工作是確保我所謂的Close()方法對所有工作簿和工作簿對象,Excel應用程序對象上還有退出()方法。我還在每個Excel對象上實例化了System.Runtime.InteropServices.Marshal.ReleaseComObject。我按照與年齡相反的順序完成所有這些工作,因此最新的對象首先被清理乾淨,最早的應用程序對象最後得到處理。我不知道訂單是否真的很重要,但似乎可能。

我見過GC.Collect()在最後被調用的例子,但我從來沒有這樣做才能讓excel.exe進程結束。

+0

我相信一個「Dispose」通常是GC.Collect()的前綴,但聽起來大多像魔術一樣對我來說,ReleaseComObject總是停止使用後漂移的excel.exe – Gregory 2009-10-23 02:30:26