尝试使用 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 服务中。完全相同的安装程序正在其他三台机器上运行。
我可以排除的事情:
- 错误的路径
- 文件不存在
- 文件已损坏
- 文件被写保护
我做过的事情:
- 已创建此处所示的桌面文件夹(第二个答案)https://social.msdn.microsoft.com/Forums/vstudio/en-US/4d6c383a-94eb-4898-9d22-aa4bb69be25b/
- 为桌面文件夹授予 "Everyone" 或 "Jeder" 权限("Jeder" 等同于德语中的 "Everyone")
- 使用当前活动用户启动服务
- 按照 Heidi2 的建议更改了 Excel 的 DCOM 配置(参见上面的 Link)
- 从 Office 365 更改为 Office Professional Plus
- 尝试打开文件时将区域设置为 en-US
- 手动打开了本应打开的文件:没有来自 excel
的错误/警告/用户对话框
- 在目标机器上安装了英语 - 美式
- 编写了一个启动执行互操作请求的 dll 的非 WCF 服务
- 编写了一个控制台应用程序来启动执行互操作请求的 dll
一些观察:
- 如果我删除桌面文件夹(请参阅我的第一个 "Things I've done"),我会收到此处描述并已解决的错误:Microsoft Office Excel cannot access the file 'c:\inetpub\wwwroot\Timesheet\App_Data\Template.xlsx'
- Excel 在任务管理器中打开了一小段时间,而 dll 试图打开 excel 文件
- 当我安装了 Office 365 时,Office Click-Once Tasks 在任务管理器中弹出,有时会冻结应用程序。这就是我切换到 Professional Plus
的原因
- 如果活动语言设置为美国英语,则不再抛出此错误;但是应该由 Interop 渲染的图像呈现为空白
我在这里错过了什么?
抱歉 - 我知道这是一个间接的回答,但我会建议您继续。我个人对 Excel Interop 服务(ASP.NET 应用程序)的体验非常糟糕。据我所知,微软 does not recommend Interop server automation.
即使您解决了这个问题,您也可能会遇到内存泄漏、性能等问题。在我之前的项目中,我们在部署之前采用了 Excel 互操作自动化。我们遇到了很多问题(Excel Interop 进程未正确关闭等),我们不得不将所有内容重写为 OpenXML。
如果可能,请使用新的 OpenXML 格式。有一个 ClosedXML library 可以使工作变得非常容易。
为什么选择 OpenXML 与 Interop?:
效率(OpenXML是轻量级的)
无内存泄漏风险
易用性
在尝试此解决方案之前,请务必阅读问题中的 "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);
如果我尝试在客户端计算机上打开 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 服务中。完全相同的安装程序正在其他三台机器上运行。
我可以排除的事情:
- 错误的路径
- 文件不存在
- 文件已损坏
- 文件被写保护
我做过的事情:
- 已创建此处所示的桌面文件夹(第二个答案)https://social.msdn.microsoft.com/Forums/vstudio/en-US/4d6c383a-94eb-4898-9d22-aa4bb69be25b/
- 为桌面文件夹授予 "Everyone" 或 "Jeder" 权限("Jeder" 等同于德语中的 "Everyone")
- 使用当前活动用户启动服务
- 按照 Heidi2 的建议更改了 Excel 的 DCOM 配置(参见上面的 Link)
- 从 Office 365 更改为 Office Professional Plus
- 尝试打开文件时将区域设置为 en-US
- 手动打开了本应打开的文件:没有来自 excel 的错误/警告/用户对话框
- 在目标机器上安装了英语 - 美式
- 编写了一个启动执行互操作请求的 dll 的非 WCF 服务
- 编写了一个控制台应用程序来启动执行互操作请求的 dll
一些观察:
- 如果我删除桌面文件夹(请参阅我的第一个 "Things I've done"),我会收到此处描述并已解决的错误:Microsoft Office Excel cannot access the file 'c:\inetpub\wwwroot\Timesheet\App_Data\Template.xlsx'
- Excel 在任务管理器中打开了一小段时间,而 dll 试图打开 excel 文件
- 当我安装了 Office 365 时,Office Click-Once Tasks 在任务管理器中弹出,有时会冻结应用程序。这就是我切换到 Professional Plus 的原因
- 如果活动语言设置为美国英语,则不再抛出此错误;但是应该由 Interop 渲染的图像呈现为空白
我在这里错过了什么?
抱歉 - 我知道这是一个间接的回答,但我会建议您继续。我个人对 Excel Interop 服务(ASP.NET 应用程序)的体验非常糟糕。据我所知,微软 does not recommend Interop server automation.
即使您解决了这个问题,您也可能会遇到内存泄漏、性能等问题。在我之前的项目中,我们在部署之前采用了 Excel 互操作自动化。我们遇到了很多问题(Excel Interop 进程未正确关闭等),我们不得不将所有内容重写为 OpenXML。
如果可能,请使用新的 OpenXML 格式。有一个 ClosedXML library 可以使工作变得非常容易。
为什么选择 OpenXML 与 Interop?:
效率(OpenXML是轻量级的)
无内存泄漏风险
易用性
在尝试此解决方案之前,请务必阅读问题中的 "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);