【发布时间】:2019-11-30 17:08:22
【问题描述】:
我有一个使用标准 Microsoft.Office.Interop.Excel 库与 Excel 电子表格交互的 .net 程序。该程序将文件路径作为命令行参数,它自己运行良好。
我还有一个 Windows 服务,它实现了一个文件侦听器来检测某个目录中的更改。当检测到新文件时,将调用 Excel 程序以及文件路径。
这个执行开始时很好,但是一旦 Excel 程序尝试打开文件:
wb = excel.Workbooks.Open(FileName);
它崩溃并出现以下错误:
System.Runtime.InteropServices.COMException (0x800A03EC): 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)
请注意,代码本身运行良好,但是当程序被 Windows 服务调用时,它会失败。
我已针对此问题进行了大量搜索,但我找到的解决方案均不适用于我的案例。 值得注意的是,我尝试更改组件服务(according to this post),但我的 DCOM Config 中根本没有 Excel 组件。
非常感谢任何建议!
【问题讨论】:
-
您的服务运行情况如何?它是否在交互式用户帐户下运行?
-
您的服务是否以特定用户身份运行?
-
办公自动化不是为在无头服务帐户下运行而设计的,即使您成功了,最终也会导致 Excel 进程在后台徘徊(未正常关闭)并耗尽内存一个结果。您可以获得旨在用于无头服务的第三方组件。
-
@Ian Robertson 感谢您的建议!我尝试在我的个人用户帐户下运行该服务,但我最终遇到了同样的错误。我想我会开始寻找解决方法。再次感谢。
-
您可能希望以 32 位运行 DCOM 配置以查看 Excel 是否存在。 (如果我记得正确的 32 位和 64 位配置是独立的。)另外,我相信即使您这样做,也需要有人登录系统才能使其正常工作。即使这样,登录的用户也可能会看到 Excel 中的弹出对话框。 - 至少对于我需要它设置的场景。