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

我正在尝试使用互操作库创buildexcel文件,但下面是我得到的错误:

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. 互操作库专为桌面应用程序构build, 强烈build议在服务器端Web应用程序(如wcf)中使用它们。
  2. 与交互式用户或DefaultAppPool相关的权限问题。

如此等等。

那么,这里的警告,我不能改变服务器端的应用程序,一切工作在其他地方。 几天前,Office 2016从我的机器上被推到了我的机器上,事情在我的本地机器上停止工作(出现以上错误)。 现在我不能去改变一个遗留的代码,但看看我能否解决我的问题在本地进行进一步的开发。

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

  1. 得到了办公室2016年卸载,并重新安装办公室2013年,同样的问题,因此恢复到办公室2016年。目前MS-Office 2016 32位安装。
  2. Microsoft Excel Application的安全选项卡的各个部分validation的权限,添加IIS AppPool \ DefaultAppPool用户,IIS_IUSRS,具有完全控制权限的交互式用户(不应该错误是“访问被拒绝”,有权限错误?
  3. 创build了一个新的示例Web应用程序,以快速debugging,运行在所有组合的CPU平台,即x86,AnyCpu,X64 – 同样的问题。
  4. 有趣的是, 如果我将示例应用程序指向IIS Express而不是本地IIS,则可以工作。
  5. 添加了可用的最新版本的互操作程序集(安装程序包Microsoft.Office.Interop.Excel – 版本15.0.4795.1000) – 仍然是相同的问题
  6. 添加到项目的Microsoft Office 16.0对象库(2.8) – 仍然是相同的问题

这是一个古老的问题,它可能更好地摆脱interop,但我想了解什么可能会出错 – 上述错误的所有直接结果build议实现IMessageFilter或什么不是,但我不能更改服务器端代码,下面行应该像前几天一样简单地工作:

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

但它不,所以改变了? 可能出了什么问题?

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

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

我build议使用Open XML SDK在服务器端处理或生成开放的XML文档,请参阅欢迎使用Open XML SDK 2.5 for Office以获取更多信息。 或者只是使用任何专为服务器端执行而devise的第三方组件。

正如您已经注意到的, Office服务器端自动化注意事项的注意事项如下:

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

如果您正在构build一个在服务器端上下文中运行的解决scheme,则应该尝试使用已经安全的组件进行无人参与的执行。 或者,您应该尝试find允许至less部分代码运行在客户端的备选scheme。 如果从服务器端解决scheme使用Office应用程序,则应用程序将缺less许多必要的function以成功运行。 此外,您将面临整体解决scheme稳定性的风险。

最后我能解决我的问题。 以下作品:

在IIS中托pipe的Web应用程序,创buildExcel文档。

所以事实certificate,除了权限之外,应用程序体系结构应该也是非常重要的,即我的应用程序是64位(作为64位操作系统上的Any CPU运行)。 每当遇到这样的问题,请确保以下(除了权限设置正确的用户权限):

  1. 确保两个应用程序的架构(即您自己的和excel)是同步的。 一个快速的方法来知道你的Excel是64位还是32位是通过查看任务pipe理器正在运行的程序。 如果excel被列为EXECEL.EXE*32那么你的办公室是32位。
  2. 当你安装一个新版本的excel时,确保你完全删除以前的版本(不仅仅是卸载,还要删除dcomconfig的办公条目,例如删除任何registry项,你可以在registry中find相关的office应用程序guid,特别是excel) 。

  3. 我通过完全删除Office 2016(如2所述),然后安装Office 2013,并在我的代码中修复相应的Microsoft.Office.Core引用。

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

如果所有上述做法仍然不能解决您的问题,那么上帝就会和您在一起,为您走向开放的XML迈进更多的力量。