Excel错误HRESULT:0x800A03EC尝试获取单元格名称的范围

我正在使用Window Service项目。 必须按顺序将数据写入Excel文件中。

但有些时候,有时候,服务抛出exception“exception从HRESULT:0x800A03EC”,而它试图获取单元格名称的范围。

我已经把打开excel表单的代码,并在这里获取单元格。

  • OS:窗口服务器2003 Office:
  • Microsoft Office 2003 sp2

1:打开Excel表格

m_WorkBook = m_WorkBooks.Open(this.FilePath, 0, false, 5, "", "", true, Excels.XlPlatform.xlWindows, ";", true, false, 0, true, 0, 0); 

2:让细胞写作

 protected object m_MissingValue = System.Reflection.Missing.Value; Range range = m_WorkSheet.get_Range(cell.CellName, m_MissingValue); // error from this method, and cell name is string. 

错误代码0x800A03EC (或-2146827284)意味着NAME_NOT_FOUND; 换句话说,你已经要求一些东西了,Excel找不到它。

这是一个generics的代码,它可以应用到很多东西,它无法find例如使用属性,这是不是像PivotItem.SourceNameStandard当一个PivotItem没有应用filter抛出此时有效。 Worksheets["BLAHBLAH"]抛出这个,当工作表不存在等。一般来说,你要求的东西具有特定的名称,它不存在。 至于为什么,这将采取一些挖掘你的一部分。

检查你的表格确实有你要求的范围,或者.CellName肯定会给出你所要求范围的名字。

我碰到这个错误,因为我试图写一个string到一个“=”开始的单元格。

解决的办法是在等号之前加一个“'”(撇号),这是告诉excel你实际上并不想写一个公式,只想打印等号的方法。

我在这里find了一个可能的解决scheme: http : //www.made4dotnet.com/Default.aspx?tabid= 141& aid=15

编辑:

如果您使用Microsoft Visual Basic .NET,Microsoft Visual C#.NET或Microsoft Visual C ++自动运行Microsoft Excel,则在调用某些方法时可能会收到以下错误,因为机器的语言环境设置为美国英语以外的其他语言环境(区域设置ID或LCID 1033):

来自HRESULT的exception:0x800A03EC

和/或

旧格式或无效的types库

解决scheme1:


为了解决这个错误,你可以在执行与Excel相关的代码时将CurrentCulture设置为en-US,并使用这两个函数重新设置为原始文件。

 //declare a variable to hold the CurrentCulture System.Globalization.CultureInfo oldCI; //get the old CurrenCulture and set the new, en-US void SetNewCurrentCulture() { oldCI = System.Threading.Thread.CurrentThread.CurrentCulture; System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); } //reset Current Culture back to the originale void ResetCurrentCulture() { System.Threading.Thread.CurrentThread.CurrentCulture = oldCI; } 

解决scheme2:


另一个解决scheme可以工作,在Microsoft Office \ Office11(或相应的办公版本)下创build一个1033目录,将excel.exe复制到1033目录,并将其重命名为xllex.dll。

虽然您可能会解决此问题的一个解决scheme,当您调用美国英语以外的语言环境中的Excel对象模型时,Excel对象模型可以采取不同的行为,并且您的代码可能会以您可能没有想到的方式失败。 例如,您可能具有将范围的值设置为date的代码:

yourRange.Value2 =“10/10/09”

根据语言环境的不同,这段代码的行为可能会有所不同,从而导致Excel将下列任何值放入范围中:

2009年10月10日2009年9月10日2010年10月9日

我得到了一个工作表名称中的空格错误:

 using (var range = _excelApp.Range["Sheet Name Had Space!$A$1"].WithComCleanup()) 

我通过将单引号围绕着带有空格的表名来解决它:

 using (var range = _excelApp.Range["'Sheet Name Had Space'!$A$1"].WithComCleanup()) 

当我尝试使用range.AddComment()函数时遇到了这个问题。 我能够通过在添加注释之前调用range.ClearComment()来解决这个问题。

枚举名称并调用worksheet.get_Range(name)时遇到此错误代码。 这似乎发生在名称不适用于一个范围,在我的情况下,它是一个macros的名称。

当我忘记取消保护工作簿或工作表时,我得到了这个。

完全没有logging的错误800A03EC(微软公司的耻辱)的含义就像“操作不支持”。

可能会发生

  • 当您打开具有由较新的Excel版本创build的内容的文档时,您当前的Excel版本不能理解。
  • 当您将文档保存到您从其中加载文档的相同path时(文件已经打开并locking)

但主要是你会看到这个错误,因为在Excel中严重的错误

  • 例如Microsoft.Office.Interop.Excel.Picture有一个属性“启用”。 当你打电话给你时,你会收到一个bool值。 但是,你会得到一个错误800A03EC。 这是一个错误。
  • Exel 2013和2016中有一个非常胖的错误:当你自动化一个Excel进程并设置Application.Visible=trueApplication.WindowState = XlWindowState.xlMinimized你会从不同的函数中获得数百个800A03EC错误(如Range.Merge (),CheckBox.Text,Shape.TopLeftCell,Shape.Locked等等)。 Excel 2007和2010中不存在此错误。

使用多米尼克的答案我发现我的问题的答案具体是源数据中的一个无效的DateTiime应用于范围之前。 在数据库,.NET和Excel之间的某个地方,date的转换默认为“1/1/1899 12:00:00 AM”。 我必须检查它,并将其转换为一个空string,它为我修复。

 if (objectArray[row, col].ToString() == "1/1/1899 12:00:00 AM") { objectArray[row, col] = string.Empty; } 

这可能是一个非常具体的例子,但是如果他们试图追踪一些无效数据,希望能够节省一些时间。

如果你可以复制整个exception,它会好得多,但是一旦我面对这个exception,这是因为从你的dll文件调用,我猜是Aspose.dll的函数没有被很好地签名。 我认为这将是可能的重复

仅供参考,为了查明你的dll是否没有被正确的签名,你应该右键点击它并进入签名,它会告诉你它是否已经被电子签名。