HRESULT异常:0x800A03EC错误

84

我运行以下代码的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: 

3
你解决了这个问题吗? - scifirocket
1
这个错误非常“通用”,可能由许多原因引起。对我而言,它发生的原因是在C#中将客户数据类型保存到Excel中。当我尝试保存日期包装器对象时,就会出现这个错误;我猜测Excel API需要将数据转换为C#基本类型,否则可能会出现问题。 - dragonfly02
我不确定这种情况有多常见,所以我将我的解决方案作为评论而不是答案发布:在我的 range.value2 = <variable> 赋值中,我在 RHS 上使用了错误的变量。在 VS 中进行类型检查时没有突出显示任何不正确的内容,可能是因为 rangeobject 类型(即接受任何类型?)。最终对我来说是一个简单的修复,但意识到这一点后令人恼火。 - Hydronium
19个回答

125

在这一行遇到了相同的错误

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

使用非零索引解决

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

这个库的创造者们怎么可能认为使用非零索引是个好主意呢?


41
可能与Excel的单元格命名方案实际上不是以零为基础的(“R1C1”)有关。 - C.B.
29
BASIC的索引从1开始。Excel在上世纪80年代就包含了BASIC作为宏/脚本语言,后来演化成了Visual Basic for Applications。当时还没有像C语言那样以0为基础的数学正确的索引方式,这种索引方式在上世纪90年代因Web技术(包括Java、Perl和Javascript)的普及而变得流行。 - Peter Gluck
很可能是针对Basic开发人员而开发的。 - Najeeb

22

这是一个常见但文档记录比较差的Excel COM 错误。据我所知,它被记录为“NAME_NOT_FOUND”,意思是Excel的COM层被禁用,找不到COM属性或方法名称。

当Excel处于“忙碌”状态时运行COM代码(例如,如果您设置了一个计时器来启动代码,并且当用户正在编辑单元格或按下鼠标按钮时代码开始运行),我经常会遇到此错误。只有当代码在主Excel线程上运行时才会出现此错误,但似乎相当于错误VBA_E_IGNORE = 0x800AC472,当在Excel处于“忙碌”状态时从另一个线程调用Excel COM对象模型时会出现该错误。

唯一的解决方法似乎是重试(稍等一小段时间)COM调用,直到成功 - 当Excel不再处于“忙碌”状态时。


看起来你可能是正确的。不幸的是,在一百万条以上的记录后,我仍然遇到了这个问题。 - Anthony Mason
如果用户正在忙于编辑公式,则此错误可能会无限期地持续存在。 - Govert
1
这也可能发生在名称实际上未找到的情况下,例如格式不正确或缺少命名范围。 - Zak

8

请检查您的起始索引。 对于Microsoft.Office.Interop.Excel范围对象,其起始位置是从1开始而不是0。 我之前也因为循环的起始值导致了相同的错误。


4

我也遇到了这个错误...

出现此错误的原因是保存文件路径包含无效字符,就像我的情况一样:

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

注意到存在\/两种符号。
也可能出现在尝试保存至尚不存在的目录时。

4

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

一旦您另存为.xslx文件,请尝试再次执行您的代码。

编辑----

进一步研究您的问题,似乎问题可能是特定于区域设置的。代码在另一台机器上是否有效?单元格的值是什么?它是日期时间格式吗?请看这里:

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

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


1
谢谢您的建议,但这不是原因。 我正在使用Excel2010,在保存为“ xlsx”后仍然发生异常。 最奇怪的部分是它并不总是发生,而只出现在某些数据组合中。虽然我找不到导致它的模式。 - Daniil Shevelev
1
请问您能否在354链接处发布ThisAddin的代码?您是想要修剪单元格中的值吗?此外,您确定Cells[x,y]不是从0开始的吗?在Excel中,单元格值从1开始,而不是基于0。 - tranceporter
当文件名过长时,我会遇到这个问题(不确定限制是多少)。 - steveo40

4

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

请创建以下文件夹: C:\Windows\SysWOW64\config\systemprofile\Desktop ·Windows 2008 Server x86
请创建以下文件夹: C:\Windows\System32\config\systemprofile\Desktop


3
我知道这是老问题了,但是我想分享一下我的经验。今天早上我也遇到了这个问题。我的错误与.xls行数限制或数组索引无关,而是由于一个不正确的公式导致的。
我正在将有关我的客户的表格从数据库导出到Excel。有人填写了客户名称为=90Erickson-King,在数据库中作为字符串类型字段很正常,但是作为Excel中的公式则会导致错误。程序没有像使用Excel时显示#N/A那样,而是在一段时间后冻结并显示了0x800A03EC错误。
我通过删除顾客姓名中的等号和破折号来纠正这个问题。之后导出就顺利完成了。
我猜测这个错误代码可能太过通用了,因为人们报告了许多不同的可能原因。

我刚花了一个小时调查SSIS包脚本中的错误。导出到Excel的字段是自由格式输入,并以“=”符号开头。快速替换以去除所有“=”符号即可解决问题。谢谢! - Dave C
所以我猜他们正在使用Office COM自动化作为访问Excel及其函数的基础方法,因为只有在使用COM时才会发生这种情况。我必须说,EPPlus或NPOI是处理开放式XML格式的更好的方式。 - Lionet Chen

2

当尝试导出一个大型Excel文件(约150,000行)时,遇到了相同的错误。

使用以下代码进行修复:

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

1

这一定是世界上最通用的错误信息,因为我今天在使用Excel Interop时遇到了它:

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

修复的方法是在连接字符串中指定ODBC:

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

如果其他人也遇到了这个错误,我希望这篇文章能够帮助他们。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接