打开Excel出错:System.Runtime.InteropServices.COMException (0x80080005):检索具有CLSID的组件的COM类工厂

3
我有一个C# .net web 应用程序。我希望用户在网页上点击一个按钮,服务器打开Excel电子表格并写入数据,用户保存文档。在本地使用Visual Studio 2010和Office 2010可以实现此功能。然而,在我的服务器上,我会遇到以下错误:

System.Runtime.InteropServices.COMException(0x80080005):由于以下错误,检索组件CLSID {00024500-0000-0000-C000-000000000046}的COM类工厂失败:80080005 Server execution failed(HRESULT异常:0x80080005(CO_E_SERVER_EXEC_FAILURE))。

我已经进行了研究,并找到了很多答案说明要打开DCOMCONFIG并添加具有对Microsoft Excel应用程序权限的用户。我的站点设置为通过安全验证,因此我添加了自己;我是服务器上的管理员,因此我确保管理员具有访问权限;我还添加了默认的App Pool Network Service;还有ASP.NET Machine Account;以及连接到数据库时应用程序使用的帐户。但我仍然得到完全相同的错误。

我的服务器是64位,Office 2007,IIS 7。

我的代码如下:
    {
        try
        {
            Excel.Application xXL = null;
            Excel.Workbook xWB = null;
            Excel.Worksheet xSheet = null;
            xXL = new Excel.Application();
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
    }

你的服务器上安装了Office吗?或者你已经将Libs与应用程序一起发布了吗? - Sorceri
1
有点不清楚:这段.NET代码在哪里运行?作为ASP.NET网页的一部分吗?在服务器端?服务器上安装了Excel吗?您知道Office自动化不支持服务器端代码吗? - Avner Shahar-Kashtan
另外,你确定你的应用程序中没有混淆服务器端和客户端模型吗?如果代码在你的服务器上打开Excel,那么访问该网页的用户将看不到它,因为它不在他的机器上。 - Avner Shahar-Kashtan
你需要确保目标服务器安装了/正确版本的程序集,同时你会复制本地程序集还是在目标服务器上安装到GAC - MethodMan
2个回答

5
  1. 在DCOMCNFG中,右键单击“我的计算机”并选择属性。
  2. 进入组件/MyComputer/DCOMConfig
  3. 进入Microsoft Excel应用程序属性安全选项卡
  4. 在启动和激活权限中,单击“自定义”并添加网络服务,授予“本地启动”和“本地激活”权限。同时给予相同的访问权限和配置权限。 点击“确定”,这样就可以运行应用程序了。

11
对于安装了x86 Office的x64机器,您可能需要运行"%windir%\SysWOW64\mmc comexp.msc /32"来访问DCOMCNFG的x86版本。 - Tim Cooke

2
办公自动化 - 使用这些 Excel.Application 和 Excel.Workbook 对象 - 不被微软建议并且不受支持。看看这个:

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

这意味着即使您解决了服务器端/客户端问题,您仍然在玩火,因为一些情况可能有效,而其他情况则无效,还有一些情况有时会起作用,有时会导致您的进程挂起,因为 Excel 在没有控制台用户登录到服务器时尝试打开弹出通知。相信我,不要这样做。
我提供的链接列出了几种你正在尝试做的事情的替代方案,但是假设你计划为用户构建相对简单的Excel表格,则最好只需创建 CSV文件 并使用适当的标头(例如 Response.ContentType =“application/vnd.ms-excel”)将其发送回用户,以便返回的数据将默认由Excel打开。 你可以在这里看到更多相关问题的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接