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

时间:2009-05-21 04:28:42

标签: c# excel exception vsto

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

但有时,有时候,服务会在尝试获取带有单元名称的范围时抛出异常“HRESULT异常:0x800A03EC”。

我已经打开excel表的代码,并在此处获取单元格。

  • 操作系统:窗口服务器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.

13 个答案:

答案 0 :(得分:17)

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

这是一个通用代码,可以应用于许多无法找到的东西,例如:使用当时无效的属性,如PivotItem.SourceNameStandard,当PivotItem没有应用过滤器时会抛出此属性。当工作表不存在时,Worksheets["BLAHBLAH"]抛出此内容。通常,您要求具有特定名称的内容并且它不存在。至于为什么,那将会对你进行一些挖掘。

检查您的表单肯定有您要求的范围,或者.CellName肯定会回复您要求的范围名称。

答案 1 :(得分:4)

我遇到了这个错误,因为我试图将一个字符串写入一个以“=”开头的单元格。

解决方案是在等号之前放一个“'”(撇号),这是一种告诉excel你不是,实际上是在尝试编写一个公式,只想打印等号的方法

答案 2 :(得分:3)

我在这里找到了一个可能的解决方案: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的异常:0x800A03EC

和/或

旧格式或无效类型库

解决方案1:


要解决此错误,您可以在执行与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;
}

解决方案2:


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

虽然您可以使用这些解决方案中的一个解决问题,但是当您在美国英语以外的区域设置中调用Excel对象模型时,Excel对象模型可能会采取不同的行为,并且您的代码可能会以您可能没有想到的方式失败。例如,您可能拥有将范围值设置为日期的代码:

yourRange.Value2 =“10/10/09”

根据区域设置,此代码可能会有不同的行为,导致Excel将以下任何值放入范围内:

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

答案 3 :(得分:3)

我在工作表名称中有一个空格错误:

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

我通过在带有空格的工作表名称周围放置单引号来修复它:

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

答案 4 :(得分:3)

完全无证件错误800A03EC(微软的耻辱!)的含义类似于"操作不支持"。

可能会发生

  • 当您打开包含由较新Excel版本创建的内容的文档时,您当前的Excel版本无法理解。
  • 将文档保存到已加载文档的同一路径(文件已打开并锁定)

但大多数情况下,由于Excel中存在严重的错误,您会看到此错误。

  • 例如,Microsoft.Office.Interop.Excel.Picture有一个属性"已启用"。当你调用它时,你应该收到一个bool值。但相反,你得到一个错误800A03EC。这是一个错误。
  • Exel 2013和2016中有一个非常胖的错误:当您自动执行Excel过程并设置Application.Visible=trueApplication.WindowState = XlWindowState.xlMinimized时,您将从不同的函数(如Range)中获得数百个800A03EC错误。 Merge(),CheckBox.Text,Shape.TopLeftCell,Shape.Locked等等。 Excel 2007和2010中不存在此错误。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

答案 8 :(得分:0)

使用Dominic的回答我发现我的问题的答案特别是源数据中的无效DateTiime,然后才应用到该范围。在数据库,.NET和Excel之间的某个位置,日期的转换默认为" 1/1/1899 12:00:00 AM"。我必须检查它并将其转换为空字符串并为我修复它。

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

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

答案 9 :(得分:0)

我遇到了在VBA中运行Excel的类似错误,我学到的是当我从MSSQL中提取数据,然后使用get_range.Value2应用它超出范围时,任何类型为uniqueidentifier(GUID)的值导致此错误。 只有当我将值转换为nvarcahr(max)时才有效。

答案 10 :(得分:0)

有趣的是,在打开let seconds = 0 const timer = new Timer(() => { seconds++ console.log('seconds', seconds) if (seconds === 8) { timer.clear() alert('Game over!') } }, 1000) timer.pause() console.log('isPaused: ', timer.paused) setTimeout(() => { timer.resume() console.log('isPaused: ', timer.paused) }, 2500) function Timer (callback, delay) { let callbackStartTime let remaining = 0 this.timerId = null this.paused = false this.pause = () => { this.clear() remaining -= Date.now() - callbackStartTime this.paused = true } this.resume = () => { window.setTimeout(this.setTimeout.bind(this), remaining) this.paused = false } this.setTimeout = () => { this.clear() this.timerId = window.setInterval(() => { callbackStartTime = Date.now() callback() }, delay) } this.clear = () => { window.clearInterval(this.timerId) } this.setTimeout() }文件格式不正确或需要修复时,也会发生此错误。

一个很难发现的错误是.xls(旧的excel)文件上的许多行。

测试一下:使用excel桌面手动打开受影响的文件。

我每天使用自动化来处理几百个文件,当出现此错误时,我会通过邮件通知所有者,并将未处理的文件保存在一个临时位置。

答案 11 :(得分:0)

您好,遇到了同样的问题

步骤

  1. 在尝试编辑和保存更改时,请确保您正在访问 Excel 文件,而不是处于只读模式(保护模式)。

  2. 如果在那之后也发生了,你可以去excel文件-->选项-->公式 并在这里禁用错误检查(这是导致几乎大多数 HRESULT 错误的原因)

答案 12 :(得分:-1)

如果你可以复制整个异常会更好,但是一旦我遇到这个异常,这是因为从你的dll文件中调用的函数,我猜是Aspose.dll还没有很好地签名。我认为这可能是this

的副本

仅供参考,为了确定你的dll是否签名不好,你应该右键点击它并转到签名处,它会告诉你它是否已经电子签名好了。