尝试使用 Microsoft.Office.Interop.Excel.Workbooks.Open() 打开 Excel 时出现异常 HResult 0x800a03ec

Exception HResult 0x800a03ec when trying to open Excel with Microsoft.Office.Interop.Excel.Workbooks.Open()

如果我尝试在客户端计算机上打开 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 是一个非常一般的错误,我无法通过它找到任何有用的信息。

我的设置:

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

我可以排除的事情:

我做过的事情:

一些观察:

我在这里错过了什么?

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

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

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

为什么选择 OpenXML 与 Interop?:

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

  2. 无内存泄漏风险

  3. 易用性

在尝试此解决方案之前,请务必阅读问题中的 "Things I've done" 段落(并尝试适用于您的内容)

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

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

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

点击突出显示的超链接

打开高级设置

将分隔符更改为点“.”

我们已经将我们的客户端/服务器解决方案从 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[many many spaces]"。 如下所示将 Trim() 添加到 fileExcel 后,一切都恢复正常。希望对以后的人有所帮助。

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