代码之家  ›  专栏  ›  技术社区  ›  Manish Mishra

使用互操作库创建Web服务器端Excel

  •  3
  • Manish Mishra  · 技术社区  · 7 年前

    我试图使用interop库创建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. 互操作库是专门为桌面应用程序构建的,在服务器端web应用程序(如wcf)中使用它们是非常必要的 highly not recommended .
    2. 与交互用户或DefaultAppPool相关的权限问题。

    等等等等。

    好的,这里有一个警告,我不能更改服务器端应用程序,其他地方一切都正常。几天前,office 2016被推到了我的机器上,我的本地机器上的东西停止了工作(出现上述错误)。现在我不能去更改遗留代码,但看看是否可以在本地解决问题以进行进一步开发。

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

    1. 卸载office 2016,并重新安装office 2013,同一版本,因此恢复到office 2016。目前已安装MS Office 2016 32位。
    2. Microsoft Excel Application ,添加了IIS AppPool\DefaultAppPool用户、IIS\u IUSRS、具有完全控制权限的交互用户(错误不应该是“拒绝访问”,权限是否错误?)
    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)中列出的应用程序ID是: 00020812-0000-0000-C000-000000000046} ,但错误有不同的。

    去哪里看?我希望对这个问题的回答能永远引导迷失的灵魂。

    2 回复  |  直到 7 年前
        1
  •  0
  •   Eugene Astafiev    7 年前

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

    正如您已经注意到的那样 Considerations for server-side Automation of Office

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

        2
  •  0
  •   Manish Mishra    7 年前

    最后我终于解决了我的问题。以下工作:

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

    因此,事实证明,除了权限之外,应用程序架构应该相似也很重要,即我的应用程序是64位的(作为 Any CPU 在64位操作系统上)。无论何时遇到此类问题,请确保以下内容(除了为正确的用户设置正确的权限外):

    1. EXECEL.EXE*32 那么你的办公室是32位的。
    2. 我按照2所述完全删除了Office 2016,然后安装了Office 2013并修复了Microsoft。办公室我的代码中相应的核心参考。

    3. 我分配的权限如下: 应用程序标识-交互式用户 在安全选项卡内,将IIS AppPool\DefaultAppPool用户添加到所有部分,并授予其完全权限。

    如果做了以上所有的事情,仍然不能解决您的问题,那么上帝与您同在,为您走向开放XML的旅程提供更多的力量。