Процесс Excel продолжает работать - PullRequest
0 голосов
/ 15 апреля 2011

Я вызываю следующий метод из события нажатия кнопки, чтобы экспортировать данные в Excel.После завершения экспорта объект приложения Excel завершается, освобождается и присваивается ничто.Но на самом деле он не выпускается и остается активным, если не закрыто все приложение.Поэтому каждый раз, когда нажимается кнопка для экспорта, новый объект приложения Excel продолжает работать.Как я могу решить это?Пожалуйста помоги.С уважением.

Проблема не возникает, если не используются две строки из метода ниже.Но я не могу их опустить, так как они действительно нужны.Проверьте отмеченные * строки.

''' <summary>
''' Exports data from a datatable to excel.
''' </summary>
Friend Shared Sub ExportToExcel(ByVal dtbl As DataTable)
    Dim exa As Excel.Application = Nothing
    Dim wkb As Excel.Workbook = Nothing
    Dim wks As Excel.Worksheet = Nothing
    Dim intColIndex, intRowIndex As Integer
    intColIndex = 0 : intRowIndex = 2

    Try
        exa = New Excel.Application
        exa.SheetsInNewWorkbook = 1
        wkb = exa.Workbooks.Add
        wks = wkb.ActiveSheet

        For intColIndex = 1 To dtbl.Columns.Count
            wks.Cells(1, intColIndex) = dtbl.Columns(intColIndex - 1).ColumnName
        Next

        For Each row As DataRow In dtbl.Rows
            For intColIndex = 1 To dtbl.Columns.Count
                wks.Cells(intRowIndex, intColIndex) = row(intColIndex - 1)
            Next

            intRowIndex += 1
        Next

        For intColIndex = 1 To dtbl.Columns.Count
            wks.Range(wks.Cells(1, intColIndex), wks.Cells(1, intColIndex)).Font.Bold = True
            wks.Range(wks.Cells(1, intColIndex), wks.Cells(1, intColIndex)).Font.Underline = True
        Next

    '***** The problem doesn't occur if the following two lines are not used *****
        wks.Range(wks.Cells(1, 1), wks.Cells(dtbl.Rows.Count + 1, dtbl.Columns.Count)).Columns.WrapText = False
        wks.Range(wks.Cells(1, 1), wks.Cells(dtbl.Rows.Count + 1, dtbl.Columns.Count)).Columns.AutoFit()
    '*****************************************************************************

        exa.Visible = True
        exa.UserControl = True

        If Not exa Is Nothing Then exa.Quit()
        System.Runtime.InteropServices.Marshal.ReleaseComObject(wks)
        wks = Nothing
        System.Runtime.InteropServices.Marshal.ReleaseComObject(wkb)
        wkb = Nothing
        System.Runtime.InteropServices.Marshal.ReleaseComObject(exa)
        exa = Nothing
    Catch ex As Exception
        wks = Nothing
        wkb = Nothing
        exa = Nothing
        MsgBox("The following error has occurred:" & vbCrLf & ex.Message, MsgBoxStyle.Critical, "Error")
    Finally
        GC.Collect()
    End Try
End Sub

Ответы [ 2 ]

1 голос
/ 15 апреля 2011

Вот ваше решение.Never use 2 dots with com objects. Ваш Range().Columns создает временную переменную, которая не освобождается.

Как правильно очистить объекты взаимодействия Excel?

http://www.velocityreviews.com/forums/showpost.php?s=f87f0674feda4442dcbd40019cbca65b&p=528575&postcount=2

0 голосов
/ 15 апреля 2011

Избегайте записи файлов Excel с помощью взаимодействия, обычно это связано с проблемами такого типа.

Предпочтительным способом было бы использовать один из различных API-интерфейсов Excel для создания файлов, таких как excelpackage , НКОИ или отлично .В качестве дополнительного бонуса пользователю не нужно устанавливать Excel (он может использовать открытый офис и т. Д.)

...