修改Excel工作表时随机出现COM异常

时间:2012-10-23 22:31:02

标签: vb.net excel com

我正在构建一个生成一些数据的应用程序,然后将其输出到Excel工作表。有时候这个工作表有几千行,所以我使用BackgroundWorker来处理它(注意我使用的进度条阻止编辑阻止用户在生成电子表格时修改它。)

不幸的是,当发生这种情况时,由于COM异常,程序会随机崩溃。随机地我是指异常在执行期间的不同时间发生,有时根本不发生。以下是导致问题的代码,总是使用sheet变量在行上调用异常。

Public Sub modifyCell(ByRef sheet As Worksheet, ByVal row As Integer, ByVal column As Integer, ByRef value As String)

    sheet.Cells(row, column) = value

End Sub

Public Sub colorRange(ByRef sheet As Worksheet, ByVal iRow As Integer, ByVal iCol As Integer, ByVal fRow As Integer, ByVal fCol As Integer, ByVal color As Integer, ByRef type As String)

    If type Is "Interior" Then
        sheet.Range(sheet.Cells(iRow, iCol), sheet.Cells(fRow, fCol)).Interior.ColorIndex = color
    ElseIf type Is "Font" Then
        sheet.Range(sheet.Cells(iRow, iCol), sheet.Cells(fRow, fCol)).Font.ColorIndex = color
    End If

End Sub

异常以不同的形式显示,包括“返回参数的类型无效。”,“HRESULT的异常:0x800A03EC”以及其他一些HRESULT代码。

另一个可能很重要的奇怪之处 - 如果我捕获该异常然后立即执行相同的行,它就可以了。 (即以下允许程序成功完成)

Try
    modify sheet code
Catch ex As Exception
    identical modify sheet code
End Try

我已经做了很多狩猎,但我无法弄清楚如何阻止这种情况发生。异常的随机性使我认为它可能像垃圾收集器在不可预测的时间运行,但我不知道如何测试该理论。

1 个答案:

答案 0 :(得分:2)

我以前经历过Excel电子表格奇怪的COM异常,我的解决方案是禁用Excel的自动恢复功能。 Interop似乎非常挑剔能够随时获取Excel,并且对我来说,只要有任何中断就抛出异常。

您可以禁用自动回复:

xlApp.Autorecover.Enabled = False

但请记住在最后再次启用它,否则它将保持良好状态。

不确定这是否能解决您的问题,但这可能值得一试。

相关问题