来自HRESULT的异常:0x800A03EC错误

时间:2012-10-03 18:31:07

标签: c# excel exception interop add-in

使用以下代码运行Excel加载项时出现“HRESULT:0x800A03EC”错误:

Excel.Range rng = ActiveSheet.Cells[x, y] as Excel.Range;                
string before = rng.Value2; 
string cleanV = System.Text.RegularExpressions.Regex.Replace(before, @"\s+", "");
rng.set_Value(cleanV);

当错误发生时,X和Y设置为1,因此不会违反Excel范围。 我进行了广泛的搜索并尝试了多种设置单元格值的方法(例如,Cells [x,y],range.set_Value()),但是为什么会出现这种错误以及如何避免它。

非常感谢任何帮助。

以下是例外情况:


System.Runtime.InteropServices.COMException was unhandled by user code
  HResult=-2146827284
  Message=Exception from HRESULT: 0x800A03EC
  Source=""
  ErrorCode=-2146827284
  StackTrace:
       at System.RuntimeType.ForwardCallToInvokeMember(String memberName, BindingFlags flags, Object target, Int32[] aWrapperTypes, MessageData& msgData)
       at Microsoft.Office.Interop.Excel.Range.set_Value(Object RangeValueDataType, Object value)
       at ImportValidation.ThisAddIn.removeAnySpaces(Int32 x, Int32 y) in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\ThisAddIn.cs:line 354
       at ImportValidation.ThisAddIn.ReadHeaders(Hashtable columnAddress) in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\ThisAddIn.cs:line 123
       at ImportValidation.ThisAddIn.mapColumns() in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\ThisAddIn.cs:line 493
       at ImportValidation.Ribbon1.button6_Click(Object sender, RibbonControlEventArgs e) in c:\Users\dshevelev\Documents\Visual Studio 2012\Projects\ImportValidation\ImportValidation\Ribbon1.cs:line 55
       at Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ControlActionRaise(IRibbonControl control)
       at Microsoft.Office.Tools.Ribbon.RibbonPropertyStorage.ButtonClickCallback(RibbonComponentImpl component, Object[] args)
       at Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.Invoke(RibbonComponentCallback callback, Object[] args)
       at Microsoft.Office.Tools.Ribbon.RibbonMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
       at Microsoft.Office.Tools.Ribbon.RibbonManagerImpl.System.Reflection.IReflect.InvokeMember(String name, BindingFlags invokeAttr, Binder binder, Object target, Object[] args, ParameterModifier[] modifiers, CultureInfo culture, String[] namedParameters)
  InnerException: 

16 个答案:

答案 0 :(得分:96)

此行中出现相同的错误

 Object temp = range.Cells[i][0].Value;

解决了非零指数

 Object temp = range.Cells[i][1].Value;

创建这个库的人怎么可能认为使用基于非零的索引是个好主意?

答案 1 :(得分:14)

这是一个常见但记录不清的Excel COM错误。我已经看到它记录为“NAME_NOT_FOUND”,这意味着Excel的COM层被禁用,并且无法找到COM属性或方法名称。

在Excel“忙”时运行COM代码时,我始终得到此错误,例如,如果您设置了启动代码的计时器,并且代码在用户编辑单元格或按下鼠标时开始运行按钮,然后你总会得到这个错误。此错误仅在代码在主Excel线程上运行时发生,但似乎相当于错误VBA_E_IGNORE = 0x800AC472,这是从另一个线程调用Excel COM对象模型时得到的,而Excel是“忙”。

唯一的解决方法似乎是重试(稍微延迟)COM调用,直到成功 - 当Excel不再“忙”时。

答案 2 :(得分:8)

检查您的起始索引。 对于Microsoft.Office.Interop.Excel范围对象,它从1开始,而不是0。 由于我的循环起始值,我收到了同样的错误。

答案 3 :(得分:4)

我们遇到了同样的问题,并为我们找到了解决方案:

  

请制作此文件夹。   C:\ WINDOWS \ Syswow64资料\ CONFIG \ systemprofile \桌面   ·Windows 2008 Server x86
  请制作此文件夹。   C:\的Windows \ system32 \设置\ systemprofile \桌面

答案 4 :(得分:3)

转到Excel选项>保存>以这种格式保存文件>选择“Excel工作簿(* .xlsx)”。 如果您使用旧版本的Excel文件(.xls)而不是.xlsx,则会出现此问题。 旧版本在Excel工作表中不允许超过65k行。

保存为.xslx后,请尝试重新执行代码。

编辑----

仔细研究您的问题,似乎问题可能是特定于语言环境。代码是否适用于另一台机器?细胞有什么价值?是datetime格式吗?看看这里:

http://support.microsoft.com/kb/320369

http://blogs.msdn.com/b/eric_carter/archive/2005/06/15/429515.aspx

答案 5 :(得分:3)

也有这个错误......

当保存到文件路径包含无效字符时会发生这种情况,在我的情况下:

path = "C:/somefolder/anotherfolder\file.xls";

请注意\/

的存在

*如果尝试保存到目前尚不存在的目录,也可能出现。

答案 6 :(得分:2)

尝试导出大型Excel文件时出现相同的错误(~150.000行) 已修复以下代码

Application xlApp = new Application();
xlApp.DefaultSaveFormat = XlFileFormat.xlOpenXMLWorkbook;

答案 7 :(得分:2)

我知道这已经过时了但只是为了表达我的经验。我今天早上遇到了它。变成我的错误与.xls行限制或数组索引无关。这是由不正确的公式引起的。

我从数据库导出到Excel有关我的客户的表格。有人将客户名称填写为=90Erickson-King,显然这可以作为数据库中的字符串类型字段,但是会导致Excel中的公式出错。当您使用Excel时,该程序不会显示#N/A,而是稍后冻结并溢出0x800A03EC错误。

我通过删除客户名称中的等号和短划线来纠正此问题。之后出口进展顺利。

我猜这个错误代码有点过于笼统,因为人们看到报告了很多不同的可能原因。

答案 8 :(得分:1)

我在使用Excel 2003 DLL并尝试写入第257列时遇到了同样的错误。 Excel 2003将每个工作表的最大列限制为256,从而引发此异常。

有关Excel 2003的详细限制,请参阅 http://office.microsoft.com/en-001/excel-help/excel-specifications-and-limits-HP005199291.aspx

从Excel 2007开始,列限制增加到16384列,请参阅 http://office.microsoft.com/en-001/excel-help/excel-specifications-and-limits-HP010073849.aspx

答案 9 :(得分:0)

一段时间后我收到同样的错误。问题是我的XLS文件包含超过65531条记录(准确地说是50万条)。我试图读取一系列细胞。

Excel.Range rng = (Excel.Range) myExcelWorkbookObj.UsedRange.Rows[i];

当我的计数器(即' i')超过65531条记录的限制时,尝试读取单元格范围时抛出异常。

答案 10 :(得分:0)

添加了另一个可能的问题,导致此问题:公式错误,因为我根据我的语言环境使用了错误的列表分隔符。 使用CultureInfo.CurrentCulture.TextInfo.ListSeparator;更正了此问题。

请注意,以下代码行引发了异常...

答案 11 :(得分:0)

这肯定是世界上最通用的错误消息,因为我今天使用Excel Interop通过以下命令获得了它:

Excel.WorkbookConnection conn;
conn.ODBCConnection.Connection = "DSN=myserver;";

解决了在连接字符串中指定ODBC的问题:

conn.ODBCConnection.Connection = "ODBC;DSN=myserver;";

其他任何人都有这个错误的机会,希望对您有所帮助。

答案 12 :(得分:0)

调用以下代码时出现此错误:wks.Range[startCell, endCell],其中startCell范围和endCell范围指向的是变量wks之外的工作表。

答案 13 :(得分:0)

此错误的另一个原因。当数据表(dtTable)的表名为空时,下面的代码示例将返回错误:

  ' Open Excel workbook
  objExcelApp = New Application
  objExcelWorkbook = objExcelApp.Workbooks.Add()
  objExcelSheet = objExcelWorkbook.ActiveSheet
  objExcelSheet.Name = dtTable.TableName

答案 14 :(得分:0)

在2020年仍然会看到此错误。如以上stt106所述,有很多可能的原因。以我为例,这是在将数据自动插入工作表的过程中,并且错误地输入了1019年而不是2019年的日期。由于我使用数据数组进行插入,因此很难找到问题,直到我切换到逐行插入。

这是我的旧代码,“隐藏”了问题数据。

    Dim DataArray(MyDT.Rows.Count + 1, MyDT.Columns.Count + 1) As Object
    Try
        XL.Range(XL.Cells(2, 1), XL.Cells(MyDT.Rows.Count, MyDT.Columns.Count)).Value = DataArray
    Catch ex As Exception
        MsgBox("Fatal Error in F100 at 1270: " & ex.Message)
        End
    End Try

一次一次插入同一行数据时,它以相同的错误停止,但是现在很容易找到有问题的数据。

这么多年以后,我会添加此信息,以防万一。

答案 15 :(得分:-1)

我遇到了同样的错误,但现在已对其进行了排序。 就我而言,我有标题为“ Key1”,“ Key2”和“ Key3”的列。我已经将列名更改为其他名称并进行了排序。

这些似乎是保留关键字。

关于, 马赫什