Копирование в Excel из приложения VB.Net вызывает ошибку 0x800A03EC в некоторых средах - PullRequest
1 голос
/ 16 мая 2009

Вот ошибка:

System.Runtime.InteropServices.COMException, Paste, Exception from HRESULT: 0x800A03EC

Все машины работают под управлением Windows XP с одинаковой версией Excel (2003). Некоторые машины получают ошибку, некоторые нет. Нам еще предстоит найти образец.

Вот код:

Public Shared Sub ExportToExcel(ByVal dt As System.Data.DataTable)
        Dim app As New Microsoft.Office.Interop.Excel.Application
        app.Visible = False
        Dim Book = app.Workbooks.Add
        Try
            Dim Sheet = CType(Book.Worksheets(1), Microsoft.Office.Interop.Excel.Worksheet)
            With Sheet
                Dim c As Long = Asc("A")
                For Each dc As DataColumn In dt.Columns
                    .Range(Chr(CInt(c)) & "1").Value = dc.ColumnName.ToString
                    .Range(Chr(CInt(c)) & "1").Font.Bold = True
                    c += 1
                Next

                Sheet.Activate()
                Sheet.Range("A2:A2").Select()
                Sheet.Paste()
                .Columns.AutoFit()
                CType(app.ActiveWorkbook.Sheets(2), Microsoft.Office.Interop.Excel.Worksheet).Delete() 
                CType(app.ActiveWorkbook.Sheets(2), Microsoft.Office.Interop.Excel.Worksheet).Delete()
            End With
            app.Visible = True
            app.UserControl = True
        Catch ex As Exception
            ExceptionManager.HandledException(ex, "Unable to Copy to Excel.", "You are SOL", , False)
        Finally
            Book = Nothing
            System.Runtime.InteropServices.Marshal.ReleaseComObject(app)
            app = Nothing
            GC.Collect()
            GC.WaitForPendingFinalizers()
        End Try

    End Sub

1 Ответ

1 голос
/ 16 мая 2009

COM - это счетчик ссылок. Система отслеживает каждый раз, когда вы используете вещи, поэтому вы должны очистить эти ссылки перед выходом следующим образом:

Marshal.ReleaseComObject(myVaraible);

Вероятно, вам не нужны WaitForPendingFinalizers, и даже GC.Collect является дорогим вызовом, который не требуется, если вы отпускаете каждый com-объект, используя приведенный выше код, чтобы уменьшить количество ссылок.

Также я не уверен, используете ли вы основные сборки взаимодействия, но вам нужно убедиться, что вы используете правильную их версию для версии Excel, на которую вы нацеливаетесь, или вы можете получить ошибки, например ту, с которой вы столкнулись.

...