读取vb.net中的excel文件会导致excel进程挂起

下面的代码工作正常,但似乎离开后台运行excel.exe的实例。 我如何去正确地closures这个子?

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 

简短的回答:closures每个项目,然后调用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) 

长答案:阅读这个答案的另一个问题 (整个职位也是有帮助的)。

我遇到了这个问题,我发现我所做的工作是确保在所有Workbook和Workbooks对象上调用Close()方法,以及在Excel Application对象上调用Quit()方法。 我也调用System.Runtime.InteropServices.Marshal.ReleaseComObject每个Excel对象被实例化。 我按照与年龄相反的顺序完成所有这些工作,所以最新的对象首先得到清理,而最早的应用程序对象最后得到处理。 我不知道这个命令是否真的很重要,但似乎可能。

我已经看到GC.Collect()在最后被调用的例子,但我从来没有这样做,让excel.exe进程结束。