【问题标题】:Exception HResult 0x800a03ec when trying to open Excel with Microsoft.Office.Interop.Excel.Workbooks.Open()尝试使用 Microsoft.Office.Interop.Excel.Workbooks.Open() 打开 Excel 时出现异常 HResult 0x800a03ec
【发布时间】:2023-04-01 22:10:01
【问题描述】:

如果我尝试在客户端计算机上打开 excel 文件,则会引发以下异常:

Exception from HRESULT: 0x800A03EC

内部异常:(空)

堆栈跟踪:

   at Microsoft.Office.Interop.Excel.Workbooks.Open(String Filename, Object UpdateLinks, Object ReadOnly, Object Format, Object Password, Object WriteResPassword, Object IgnoreReadOnlyRecommended, Object Origin, Object Delimiter, Object Editable, Object Notify, Object Converter, Object AddToMru, Object Local, Object CorruptLoad)
   at (own assembly)

这个 HResult 是一个非常通用的错误,我找不到任何有用的信息。

我的设置:

在 Windows 服务中运行的 WCF 服务。完全相同的安装程序正在其他三台机器上运行。

我可以排除的事情:

  • 路径错误
  • 文件不存在
  • 文件已损坏
  • 文件被写保护

我做过的事情:

  • 创建了桌面文件夹,如下所示(第二个答案)https://social.msdn.microsoft.com/Forums/vstudio/en-US/4d6c383a-94eb-4898-9d22-aa4bb69be25b/
  • 为桌面文件夹授予“Everyone”或“Jeder”权限(“Jeder”相当于德语中的“Everyone”)
  • 使用当前活跃用户启动服务
  • 按照 Heidi2 的建议更改了 Excel 的 DCOM 配置(参见上面的链接)
  • 从 Office 365 更改为 Office Professional Plus
  • 尝试打开文件时区域设置为 en-US
  • 手动打开应该打开的文件:没有来自 excel 的错误/警告/用户对话框
  • 在目标计算机上安装了英语 - 美国
  • 编写了一个非 WCF 服务来启动执行互操作请求的 dll
  • 编写了一个控制台应用程序来启动执行互操作请求的 dll

一些观察:

  • 如果我删除桌面文件夹(请参阅我的第一个“我已经完成的事情”),我会收到此处描述并解决的错误:Microsoft Office Excel cannot access the file 'c:\inetpub\wwwroot\Timesheet\App_Data\Template.xlsx'
  • 当 dll 尝试打开 Excel 文件时,Excel 在任务管理器中打开了一小段时间
  • 虽然我安装了 Office 365,但 Office Click-Once 任务在任务管理器中弹出,有时会冻结应用程序。这就是我改用 Professional Plus 的原因
  • 如果活动语言设置为美国英语,则不再抛出此错误;但是应该由 Interop 渲染的图像被渲染为空白

我在这里错过了什么?

【问题讨论】:

    标签: excel wcf windows-services interop


    【解决方案1】:

    对不起 - 我知道这是一个间接的答案,但我建议你继续。我个人对 Excel 互操作服务(ASP.NET 应用程序)的体验非常糟糕。据我所知微软does not recommend Interop server automation

    即使您解决了这个问题,您也可能会遇到内存泄漏、性能等问题。在我之前的项目中,我们在部署之前使用 Excel 互操作自动化进行了改进。我们偶然发现了很多问题(Excel 互操作进程未正确关闭等),我们不得不将所有内容都重写为 OpenXML。

    如果可能,请使用新的 OpenXML 格式。有一个 ClosedXML library 可以让使用变得非常容易。

    为什么选择 OpenXML 与 Interop?:

    1. 效率(OpenXML 是轻量级的)

    2. 无内存泄漏风险

    3. 易于使用

    【讨论】:

    • 是的,你是对的。不幸的是,我不是调用 Interop 的库的作者,因此无法更改它。据我了解,该库已经使用 OpenXML 库来更改值等,但最后,它需要对生成的文件进行截图。对于此特定操作,它使用互操作。
    【解决方案2】:

    在尝试此解决方案之前,请确保您阅读了问题中的“我已经完成的事情”段落(并尝试了适用于您的方法)

    打开文档时抛出异常;在生成 Excel 的机器上,生成的文件无效。

    解决方案是更改数字的格式。

    进入系统配置 -> 时间、语言和地区 -> 语言

    点击突出显示的超链接

    打开高级设置

    将分隔符更改为点“.”

    【讨论】:

      【解决方案3】:

      我们已经将我们的客户端/服务器解决方案从 4GL 语言转换为 C#,其中嵌入的 C# 代码之前没有任何问题,并且开始收到相同的错误消息。

      Excel.Application excelApp = new Excel.Application();
      Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(fileExcel,
          0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
          true, false, 0, true, false, false);
      

      我已按照此线程中的所有说明进行操作,但无济于事,直到我意识到在我们的例子中至少 fileExcel,它包含文件名的完整路径并定义为System.String fileExcel 有尾随空格,例如而不是“C:\temp\MyTest.xls”,而是“C:\temp\MyTest.xls[许多空格]”。 一旦我将Trim() 添加到fileExcel,如下所示,一切都恢复正常。希望它对将来的人有所帮助。

      Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(fileExcel.Trim(),
          0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
          true, false, 0, true, false, false);
      

      【讨论】:

        猜你喜欢
        • 2018-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-14
        • 2013-03-13
        • 1970-01-01
        • 1970-01-01
        • 2017-07-12
        相关资源
        最近更新 更多