【问题标题】:Reading excel files in vb.net leaves excel process hanging在 vb.net 中读取 excel 文件会使 excel 进程挂起
【发布时间】:2009-10-23 13:24:31
【问题描述】:

以下代码运行良好,但似乎让 excel.exe 的实例在后台运行。我该如何正确关闭这个子?

    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

【问题讨论】:

  • 旁白:使用 xlApp = New Excel.Application,而不是 Excel.ApplicationClass。 ApplicationClass 不应该被使用 - 无论如何你已经将 XlApp 声明为 Excel.Application。

标签: vb.net excel


【解决方案1】:

简答:适当地关闭每个项目,然后对它们调用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,这是我发现的唯一可行的解​​决方案。 2个GC非常重要
【解决方案2】:

我遇到了这个问题,我发现我的工作是确保我在所有 Workbook 和 Workbooks 对象上调用了 Close() 方法,以及在 Excel Application 对象上调用了 Quit() 方法。我还在每个 Excel 对象实例化时调用 System.Runtime.InteropServices.Marshal.ReleaseComObject。我按照年龄相反的顺序执行所有这些操作,因此首先清理最新的对象,最后处理最旧的对象,即 Application 对象。我不知道顺序是否真的很重要,但似乎很重要。

我已经看到了在最后调用 GC.Collect() 的示例,但我从来不需要这样做来结束 excel.exe 进程。

【讨论】:

  • 我相信“Dispose”通常以 GC.Collect() 为前缀,但对我来说听起来很神奇,ReleaseComObject 在使用后总是阻止 excel.exe 浮动
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-07
  • 2011-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多