在excel文件读取时检索具有CLSID的组件的COM类工厂

时间:2018-02-19 09:25:56

标签: asp.net com webserver office-interop somee

我有一个asp.net项目,它读取excel文件并使用 Microsoft Excel 16对象库 Microsoft Office 16对象库检索其数据..每件事都是在开发机器上很好,我可以阅读数据......但在我发布网站并将其上传到somee.com上免费托管...我上传excel的部分进展顺利,但在阅读数据部分我得到了这个错误

  

System.Runtime.InteropServices.COMException:检索COM类   带有CLSID的组件的工厂   {00024500-0000-0000-C000-000000000046}由于以下原因而失败   错误:80040154未注册类(HRESULT异常:   0x80040154(REGDB_E_CLASSNOTREG))。

我搜索了原因,我认为问题是关于excel库,主机可能不支持或类似的东西...谢谢你,如果你帮我算一算。

1 个答案:

答案 0 :(得分:1)

您违反了Office Automation的基本规则 - 不要在服务器上执行此操作。周期。

可以在服务器上安装Office,甚至可以手动注册一些内容,使其足以使您的Web应用程序在您进行测试时工作一到两次。但是,只要该应用程序进入生产环境,它就会一直或间歇地开始失败,甚至可能导致您的Web应用程序完全挂起。 Office是一组应用程序,而不是一组数据操作库。关于它的一切都被设计为好像用户在交互式会话中运行它 - 它为许多操作创建窗口,并且它本身就是多进程的。您的服务器在非交互式会话中运行,并且在此方案下,窗口管理的规则也不同。在服务器应用程序中,实际上无法使Office自动化安全,尤其是托管多个应用程序/站点和/或高流量的服务器。

"正确"这样做的方法是使用一个将Office文档纯粹视为数据结构的库。执行此操作的库可以读取和操作文档中的数据,而无需调用Office来执行此操作。类比是XML文档 - 您使用.NET API(如XmlDocumentXDocument)来读取文件中的数据,在内存中操作它并将其存储回磁盘。这与尝试自动执行用户使用某些可视XML编辑器应用程序执行的操作非常不同。

我建议您查看Open XML SDK,这是一个由Microsft提供的库,用于此目的。所有Office 2007+文档都以称为Open XML的开放格式存储。该库按照该文件格式的规范进行编码。