3

我正在构建一个生成一些数据然后将其输出到 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

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

4

1 回答 1

2

我之前在 Excel 电子表格中遇到过奇怪的 COM 异常,我的解决方案是禁用 Excel 的自动恢复功能。Interop 似乎对能够随时访问 Excel 非常挑剔,对我来说,只要有任何中断它就会抛出异常。

您可以这样禁用自动恢复:

xlApp.Autorecover.Enabled = False

但请记住在最后再次启用它,否则它将永远关闭。

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

于 2012-10-29T16:43:37.360 回答