从VB.Net应用程序复制到Excel导致在某些环境中的0x800A03EC错误

这是错误:

System.Runtime.InteropServices.COMException,粘贴,从HRESULTexception:0x800A03EC

所有机器都是具有相同版本的Excel(2003)的Windows XP。 有些机器出错,有些则不。 我们还没有find一个模式。

这里是代码:

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 

COM是引用计数。 系统每次都使用一个计数器,所以你应该在退出之前清理这些引用,如下所示:

 Marshal.ReleaseComObject(myVaraible); 

您可能不需要WaitForPendingFinalizers,即使GC.Collect是一个昂贵的调用,如果您使用上面的代码释放每个com对象以降低引用计数,则不应该需要这样的调用。

另外,我不确定您是否使用了主互操作程序集,但是您需要确保将正确版本的Excel版本用于您的定位Excel版本,否则可能会遇到您遇到的错误。