Чтение файлов Excel в vb.net приводит к зависанию процесса Excel - PullRequest
3 голосов
/ 23 октября 2009

Следующий код работает нормально, но кажется, что экземпляры 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

Ответы [ 2 ]

4 голосов
/ 23 октября 2009

Краткий ответ: закройте каждый элемент соответствующим образом, затем вызовите 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)

Длинный ответ: прочитайте этот ответ на другой вопрос (весь пост тоже полезен).

0 голосов
/ 23 октября 2009

Я столкнулся с этой проблемой и убедился, что вызвал метод Close () для всех объектов Workbook и Workbooks, а также метод Quit () для объекта приложения Excel. Я также вызываю System.Runtime.InteropServices.Marshal.ReleaseComObject для каждого экземпляра объекта Excel. Я делаю все это в порядке, обратном возрасту, поэтому самый новый объект очищается первым, а самый старый, который является объектом приложения, заботится о последнем. Я не знаю, действительно ли заказ имеет значение, но кажется, что это возможно.

Я видел примеры, когда GC.Collect () вызывался в самом конце, но мне никогда не приходилось делать это, чтобы завершить процесс excel.exe.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...