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

5

如果我尝试在客户机上打开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没有出现任何错误/警告/用户对话框
  • 在目标机器上安装了英语-US
  • 编写了一个非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任务在任务管理器中弹出,有时会冻结应用程序。这就是为什么我切换到Professional Plus的原因
  • 如果将活动语言设置为英语-US,则不再抛出此错误;但是由Interop渲染的图像将被渲染为空白

我在这里漏掉了什么?

3个回答

4

抱歉-我知道这是一个间接的答案,但我建议你继续下去。我个人对Excel Interop服务(ASP.NET应用程序)有非常糟糕的经历。据我所知,微软不推荐使用Interop服务器自动化

即使您解决了此问题,您可能会遇到内存泄漏,性能等问题。在我的上一个项目中,我们通过Excel interop自动化进行了进一步的开发,直到部署。我们遇到了很多问题(Excel Interop进程不能正确关闭等),我们不得不重新编写所有内容以便使用OpenXML。

如果可能,请使用新的OpenXML格式。有一个ClosedXML库可以让工作变得非常简单。

为什么要使用OpenXML而不是Interop?:

  1. 效率(OpenXML轻巧)

  2. 没有内存泄漏风险

  3. 易于使用


是的,你说得对。 不幸的是,我不是调用Interop的库的作者,因此无法更改它。据我所知,该库已经使用OpenXML库来更改值等,但最终需要对生成的文件进行截屏。对于这个特定的操作,它使用Interop。 - Florian Moser

2
在尝试此解决方案之前,请确保您已阅读问题中的“我所做的事情”段落(并尝试适用于您的内容)。
在打开文档时抛出了异常;在生成Excel文件的计算机上,文件生成无效。
解决方案是更改数字格式。
进入系统配置->时间、语言和区域->语言。
点击突出显示的超链接。
打开高级设置。
将分隔符更改为点“。”

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接