我正在构建一个应用程序,它生成一些数据,然后将其输出到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
我已经做了相当多的搜寻,但我想不出如何阻止这种情况发生。异常的随机性让我认为它可能类似于垃圾收集器,它在不可预测的时间运行,但我不知道如何测试这一理论。
发布于 2012-10-30 00:43:37
我以前遇到过Excel电子表格的奇怪的COM异常,我的解决方案是禁用Excel的自动恢复功能。Interop似乎真的很挑剔,不能随时访问Excel,而且对我来说,每当有任何东西中断它时,它都会抛出异常。
可以禁用自动恢复,如下所示:
xlApp.Autorecover.Enabled = False
但记住在最后再次启用它,否则它将永远关闭。
我不确定这是否能解决你的问题,但它可能值得一试。
https://stackoverflow.com/questions/13040342
复制相似问题