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

时间:2015-05-06 13:48:53

标签: excel wcf windows-services interop

如果我尝试在客户端计算机上打开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的建议更改了DCOM Config for Excel(请参阅上面的链接)
  • 从Office 365更改为Office Professional Plus
  • 尝试打开文件时,区域设置设置为en-US
  • 手动打开文件,应该打开:excel没有错误/警告/用户对话
  • 在目标计算机上安装英语 - 美国
  • 写了一个非WCF服务,它启动执行Interop请求的dll
  • 编写了一个启动执行Interop请求的dll的控制台应用程序

一些观察:

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

我在这里缺少什么?

3 个答案:

答案 0 :(得分:3)

对不起 - 我知道这是一个间接的答案,虽然我建议你继续。我个人对Excel Interop服务(ASP.NET应用程序)有很糟糕的经验。我知道微软does not recommend Interop server automation

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

如果可能的话,请使用新的OpenXML格式。有一个ClosedXML library可以让您轻松使用。

为什么OpenXML与Interop?:

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

  2. 无内存泄漏风险

  3. 易于使用

答案 1 :(得分:1)

在尝试此解决方案之前,请务必阅读“我已完成的事情”#34;问题中的段落(并尝试了适合您的内容)

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

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

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

Go into Systemconfiguration -> Time, Language and Region -> Language

点按突出显示的超链接

打开高级设置

Open Advanced Settings

将分隔符更改为"。" Change the delimiter to a point "."

答案 2 :(得分:0)

我们已经将客户端/服务器解决方案从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);