使用 Interop 库进行 Web 服务器端 Excel 创建

Using Interop Library for Web Server Side Excel Creation

我正在尝试使用互操作库创建 excel 文件,但出现以下错误:

Creating an instance of the COM component with CLSID {00024500-0000-0000-
C000-000000000046} from the IClassFactory failed due to the following error: 8001010a 
The message filter indicated that the application is busy. 
(Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)). 

我在网上查了很多资源,大致可以分为以下几类:

  1. Interop 库是专门为桌面应用程序构建的,在服务器端 Web 应用程序(例如 wcf)中使用它们是 highly not recommended
  2. 与交互式用户或 DefaultAppPool 相关的权限问题。

如此等等。

好吧,请注意,我无法更改服务器端应用程序,但在其他地方一切正常。几天前,Office 2016 从 IT 推送到我的机器上,并且在我的本地机器上停止工作(出现上述错误)。现在我不能去更改遗留代码,但看看我是否可以解决我本地的问题以进行进一步的开发。

这是我所做的,请注意,这台机器上的一切都在工作(当 office 2013 在那里时):

  1. 卸载了 office 2016,然后重新安装了 office 2013,同样的问题,因此恢复为 office 2016。目前安装的是 MS-Office 2016 32 位。
  2. 已验证 Microsoft Excel Application 安全选项卡各个部分的权限,已添加 IIS AppPool\DefaultAppPool 用户,IIS_IUSRS,具有完全控制权限的交互式用户,(错误应该不是"Access denied",权限有误吗?)
  3. 创建了一个新的示例 Web 应用程序,以快速调试,运行 它在 cpu 平台的所有组合中,即 x86、AnyCpu、x64 - 同样的问题。
  4. 有趣的是,如果我将示例应用程序指向 IIS Express 而不是本地 IIS,它会起作用。
  5. 添加了最新版本的互操作程序集(安装包 Microsoft.Office.Interop.Excel - 版本 15.0.4795.1000)- 仍然是同样的问题
  6. 向项目添加了 Microsoft Office 16.0 对象库 (2.8) - 仍然是同样的问题

这是一个古老的问题,最好不要使用互操作,但我想了解可能出了什么问题 - 上述错误的所有直接结果都建议实施 IMessageFilter 或不实施,但我无法更改服务器端代码,下面的行应该像几天前一样简单地工作:

Microsoft.Office.Interop.Excel.Application l_ExcelApp = 
new Microsoft.Office.Interop.Excel.Application();

但事实并非如此,那么发生了什么变化?可能出了什么问题?

此外,如果它有帮助 - dcomcnfg (/32) 中列出的 ApplicationID 是:00020812-0000-0000-C000-000000000046},但错误是不同的。

去哪里看?我希望这个问题的答案可以永远指导迷失的灵魂。

我建议使用 Open XML SDK 在服务器端处理或生成打开的 XML 文档,有关详细信息,请参阅 Welcome to the Open XML SDK 2.5 for Office。或者只使用为服务器端执行而设计的任何第三方组件。

正如您已经注意到的,Considerations for server-side Automation of Office 文章陈述如下:

Microsoft 目前不推荐也不支持从任何无人值守的非交互式客户端应用程序或组件(包括 ASP、ASP.NET 自动化 Microsoft Office 应用程序、DCOM 和 NT 服务),因为当 Office 在此环境中为 运行 时,Office 可能表现出不稳定的行为 and/or 死锁。

如果您要在服务器端上下文中构建 运行 的解决方案,您应该尝试使用已针对无人值守执行安全设置的组件。或者,您应该尝试找到至少允许 运行 客户端部分代码的替代方案。如果您从服务器端解决方案使用 Office 应用程序,该应用程序将缺少许多 运行 成功所必需的功能。此外,您将承担整体解决方案稳定性的风险。

我终于解决了我的问题。以下作品:

在 IIS 中托管的 Web 应用程序,正在创建 excel 个文档。

事实证明,除了权限之外,应用程序架构应该相似也很重要,即我的应用程序是 64 位的(运行ning as Any CPU on 64bit OS).每当您 运行 遇到此类问题时,请确保还遵循以下内容(除了为正确的用户设置正确的权限之外):

  1. 确保两个应用程序的架构,即(您自己的和 excel)是同步的。了解您的 excel 是 64 位还是 32 位的一种快速方法是查看任务管理器 运行ning 程序。如果 excel 被列为 EXECEL.EXE*32 那么你的办公室是 32 位的。
  2. 当您安装 excel 的新版本时,请确保您完全删除了以前的版本(不仅是卸载,而且还删除了 dcomconfig office 条目,即通过删除任何注册表条目,您可以在regedit中找到涉及的office应用程序guid,特别是excel).

  3. 我按照 2 中的描述完全删除了 Office 2016,然后安装了 Office 2013 并在我的代码中相应地修复了 Microsoft.Office.Core 引用。

  4. 我分配的权限如下: 应用程序身份 - 交互式用户 在“安全”选项卡中,将 IIS AppPool\DefaultAppPool 用户添加到所有部分并授予完全权限。
  5. 我的应用 运行 在 IIS 中的 ApplicationPoolIdentity 中。

如果以上都做了,还是不能解决你的问题,那么上帝与你同在,在你走向开放的道路上赐予你更多的力量XML.