【问题标题】:Excel error HRESULT: 0x800A03EC while trying to get range with cell's nameExcel 错误 HRESULT: 0x800A03EC 尝试使用单元格名称获取范围
【发布时间】:2010-10-27 20:15:17
【问题描述】:

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

但有时,只是有时,服务在尝试使用单元格名称获取范围时抛出异常“Exception from HRESULT: 0x800A03EC”。

我已经把打开excel表格的代码放在这里了。

  • 操作系统:window server 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.

【问题讨论】:

  • 你说“只是有时”的方式让我想到了这个问题的答案:stackoverflow.com/questions/20422387/…
  • 我有同样的问题在 C# 代码中我输入了xApp.Cells(3, 1).FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)":失败;然后xApp.Cells(3, 1).FormulaR1C1 = "=(R[-2]C+R[-1]C)":失败;然后xApp.Cells(3, 1).FormulaR1C1 = "=A1+A2"成功

标签: c# excel exception vsto


【解决方案1】:

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

这是一个通用代码,它可以应用于很多它找不到的东西,例如。当 PivotItem 未应用过滤器时,使用当时无效的属性(如 PivotItem.SourceNameStandard)会抛出此错误。 Worksheets["BLAHBLAH"] 抛出这个,当工作表不存在等时。一般来说,你要求的是具有特定名称的东西,但它不存在。至于为什么,这需要你自己去挖掘。

检查您的工作表是否确实有您要求的范围,或者.CellName 肯定会返回您要求的范围的名称。

【讨论】:

  • 您能否提供参考来证实您的“错误代码 0x800A03EC(或 -2146827284)表示 NAME_NOT_FOUND”的说法?我还没找到...
  • @ForeverWintr:我正在尝试挖掘一个链接,但这个回复来自 10 个月前,并且基于我当时的研究。我也一直在构建基于 Excel 的 VSTO 解决方案,当它无法按名称、范围等定位项目时,我已经看到了很多。这是一个非常普遍的错误,因此它可能出现在其他 Office 应用程序中并且意味着什么不同(如文件保存、自动化错误),但如果它不适用于此 OP,它帮助我解决了过去的类似问题。
  • 我问的原因是我在 VSTO 项目中遇到的频率如此之高且调用范围如此广泛的 0x800A03EC,我开始认为它只是意味着“Excel 错误”。您的回答是我遇到的唯一对“NAME_NOT_FOUND”的引用。
  • @ForeverWintr 你使用 Err.exe 工具,它是一个命令行工具,只需将它放在 System32 中并从 dos 提示符调用它:err 0x800A03EC,它使用 OS 头文件。
【解决方案2】:

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

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

【讨论】:

  • 但是如果我真的想写一个公式呢?
【解决方案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】:

    完全未记录错误 800A03EC(微软感到羞耻!)的含义类似于“不支持操作”。

    可能会发生

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

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

    • 例如,Microsoft.Office.Interop.Excel.Picture 具有“已启用”属性。当您调用它时,您应该收到一个布尔值。但是,您会收到错误 800A03EC。这是一个错误。
    • Exel 2013 和 2016 中存在一个非常严重的错误:当您自动化 Excel 流程并设置 Application.Visible=trueApplication.WindowState = XlWindowState.xlMinimized 时,您将收到来自不同函数的数百个 800A03EC 错误(如 Range.Merge()、 CheckBox.Text、Shape.TopLeftCell、Shape.Locked 等等)。 Excel 2007 和 2010 中不存在此错误。

    【讨论】:

    • 如果您正在写入坐标为零的单元格,也会发生这种情况。单元格编号为 1 及以上。
    【解决方案5】:

    我在这里找到了一个可能的解决方案: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 并使用这 2 个函数重置回您的原始版本。

    //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(或您对应的office-version)下创建一个1033目录,将excel.exe复制到1033目录,并将其重命名为xllex.dll。

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

    yourRange.Value2 = "10/10/09"

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

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

    【讨论】:

    • 解决方案 1 对我有用。在法语中,SUM 的等价物是 SOMME。我通过 C# 对我的 Excel 说“SUM”翻译成英文。公式没问题,但 Excel 说#NAME。双击单元格并按 ENTER 后没有任何更改,Excel 给出了公式结果。在 C# 中发送SOMME 输出SUM。所以,解决方案 1 允许我发送SUM而不会出错。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

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

      【讨论】:

        【解决方案8】:

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

        【讨论】:

          【解决方案9】:

          使用多米尼克的回答,我发现我的问题的答案具体是源数据中的 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;
          }
          

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              有趣的是,在打开.XLS? 文件格式不正确或需要修复时也会出现此错误。

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

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

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

              【讨论】:

                【解决方案12】:

                您好,遇到了同样的问题

                步骤

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

                2. 如果之后也发生这种情况,您可以转到 excel 文件-->选项-->公式 并在此处禁用错误检查(这是几乎大多数 HRESULT 错误的原因)

                【讨论】:

                  【解决方案13】:

                  Excel 范围索引为无零,从 1 开始。
                  如果调用sheet.Rows[0]sheet.Columns[0]sheet.Cells[0] 会抛出异常,因为索引从1 开始,0 为无效索引。

                  【讨论】:

                    【解决方案14】:

                    如果您可以复制整个异常,那就更好了,但是一旦我遇到这个异常,这是因为从您的 dll 文件调用的函数(我猜是 Aspose.dll)没有被很好地签名。我认为这可能是this的重复

                    仅供参考,为了确定您的 dll 是否没有正确签名,您应该右键单击它并转到签名处,它会告诉您它是否已被电子签名正确。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 2023-04-01
                      • 1970-01-01
                      • 2011-01-23
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多