2009-10-23 81 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