我们正在使用ASP.NET 2.0开发一些内部实用程序。其中之一是从数据库中提取一些信息,并根据对数据库的查询构建包含大量电子表格的Excel工作簿。
概念验证原型(一个简单的ASP.NET页面,它从数据库中查询单个项目并打开Excel以将数据添加到工作表)在开发机器上本地运行时运行良好,愉快地创建和显示根据要求提供的Excel电子表格。但是,在我们的服务器上运行时,我们在尝试实例化Excel时会收到以下错误。
无法将“Microsoft.Office.Interop.Excel.ApplicationClass”类型的COM对象强制转换为接口类型“Microsoft.Office.Interop.Excel._Application”。此操作失败,因为由于以下错误,对IID为“{000208D5-0000-0000-C000-000000000046}”的接口的COM组件的QueryInterface调用失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE))
我们正在使用PIA for Excel 2003,我们在服务器上安装了Excel 2003和PIA。任何人都可以解释为什么这不起作用或给我们一些关于我们如何追踪问题的提示?
感谢您提供的任何帮助。
答案 0 :(得分:1)
运行ASP.NET应用程序池的用户是否可以访问该应用程序?尝试以该用户身份登录(或更改应用程序池以该用户身份运行)并打开Excel。如果可行则尝试在服务器上运行WinForms应用程序作为具有失败代码的用户。
不确定,但我认为可能需要通过regsvr32注册PIA程序集。
我怀疑如果你作为网络服务运行,你将无法启动Excel(没有交互式登录,受限制的帐户等)。您的ASP.NET代码在应用程序池中运行。您可以通过IIS管理器更改应用程序池运行的用户。如果要查看当前运行的代码,请在任务管理器中查找w3wp进程。
要进行测试,请将应用程序池更改为以您熟悉的用户身份运行。
答案 1 :(得分:1)
我们使用Aspose(商业)。服务器上的办公室并不是很有趣。
它被称为PI(t)A,原因是......
答案 2 :(得分:1)
考虑使用 XLSX文件(Office 2007中的新增功能,但有一个Office 2003插件),它们只是包含XML文件的ZIP文件,您可以在不需要Excel的情况下进行操作。 (基于XML的)SpreadsheetML有很好的文档记录,并且不太复杂,无法编程(您甚至可能在Web上的某处找到LINQ to SpreadsheetML)。
如上所述,Excel实际上不是服务器产品,在服务器上使用它时可能会遇到各种问题。
答案 3 :(得分:1)
我认为问题在于,一旦将应用程序部署到IIS,您就会突然在MTA COM Apartment中运行。我相信Excel是一个STA组件,因此无法在MTA中创建。您需要在正在使用的页面中设置aspcompat选项
<%@ page aspcompat=true %>
答案 4 :(得分:1)
来自Microsoft,(强调原始来源):
Microsoft目前不建议也不支持从任何无人参与的非交互式客户端应用程序或组件(包括ASP,ASP.NET,DCOM和NT服务)自动化Microsoft Office应用程序,因为Office在此环境中运行Office时,可能会出现不稳定的行为和/或死锁。
列出了您不应该这样做的原因:
- ...许多服务在没有用户配置文件的帐户下运行(例如SYSTEM帐户或IWAM_ [servername]帐户)。因此,Office可能无法在启动时正确初始化。在这种情况下,Office会在CreateObject函数或CoCreateInstance函数上返回错误。即使可以启动Office应用程序,如果不存在用户配置文件,其他功能也可能无法正常工作。
- 如果发生意外错误,或者如果需要使用未指定的参数来完成某项功能,则Office旨在通过模式对话框提示用户,该对话框会询问用户用户想要执行的操作。无法解除非交互式桌面上的模式对话框。因此,该线程无限期地停止响应(挂起)。虽然某些编码实践可以帮助降低此问题的可能性,但这些实践无法完全阻止该问题。 这一事实本身使得从服务器端环境运行Office应用程序变得风险且不受支持。
- 服务器端组件需要是高度可重入的多线程COM组件,这些组件具有最小的开销和多个客户端的高吞吐量。 Office应用程序几乎在所有方面都恰恰相反。 Office应用程序是不可重入的基于STA的自动化服务器,旨在为单个客户端提供多种但资源密集型的功能。
您的代码可能会抛出以下错误:
CoCreateInstance
最后:
由于Office设计的限制,对Office配置的更改不足以解决所有问题。 Microsoft强烈建议使用许多替代方案,这些方案不需要在服务器端安装Office,并且可以比自动化更高效,更快速地执行大多数常见任务。在将Office作为服务器端介入之前项目中的组件,考虑替代方案。