让 IIS 与 Excel 和谐共处

本文的实验环境如下: Win7 X64, IIS 7.5, .Net 4.5

微软为了安全方面的考虑,不建议也不支持在服务器端直接操作 Excel(详见文末的《更多资源》),这直接导致当你试图在 Web 服务器端使用 Excel COM 组件操作 Excel 的时候会得到莫名其妙的错误。但是有些时候,各别项目(比如和财务相关的项目,会需要导出、导入 Excel)可能仍然需要操作 Excel。这个时候,有几种办法来解决,1、使用第三方的组件来操作 Excel 比如 NPOI、ASPOSE等;2、依旧使用 Excel COM 组件。

第一种方式需要引入第三方组件,最简单也可能最麻烦,简单是因为该解决方案简单粗暴,麻烦则是因为使用它们可能会涉及到一些版权问题,也可能需要收费。

第二个方式,是本文的重点,也是相对比较麻烦的一种方式。


错误一:Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005

当我们开发了一个 ASP.NET 网站,并在其中引入了如下代码(代码仅作为测试使用,不具有任何实际功能):

protected void Button1_Click(object sender, EventArgs e)
{
    try
    {
        Excel.Application app = new Excel.Application();
        Excel.Workbook book = app.Workbooks.Open(@"E:\1.xls");
        this.Button1.Text = "OX";
    }
    catch (Exception ex)
    {
        this.Button1.Text = ex.Message;
    }
}

当我们选择在 Visual Studio 的调试器进行调试时,发现点击按键的功能正常(按钮的文字变成了 “OX”)。当我们欣喜地把网站部署到 IIS 后,点击按钮,居然报错了,按钮上的文字变成了:

Retrieving the COM class factory for component with CLSID {00024500-0000-0000-C000-000000000046} failed due to the following error: 80070005

出错了


通过将 Visual Studio 的调试器附加到 IIS 后,可以发现报错的语句就是:

    Excel.Application app = new Excel.Application();


解决方案

问了下谷哥后,你会知道这个就是因为微软不支持而导致的,解决这个问题需要如下步骤:

1、打开组件服务:运行 -> DCOMCNFG,并找到 组件服务 -> 计算机 -> 我的电脑 -> DCOM 配置 -> Microsoft Excel Application。

    1.1、如果 Microsoft Excel Application 不存在,请先在命令行窗口中运行 “mmc comexp.msc /32”。

组件服务


找到 “Microsoft Excel Application”

2、选择 更多操作 -> 属性 -> 切换到 “安全” 选项卡。

3、在第一个 “启动和激活权限” 的分组中选择 “自定义”,并点击 “编辑”。

4、将当前运行网站的用户添加到 “组或用户名” 中。如果你的应用程序池设置的是 ApplicationPoolIdentity,那么运行网站的用户就是 “IIS APPPOOL\应用程序池的名称”,你可以通过查看 IIS 应用程序池界面中的标识来确定。

添加用户(对象类型为 “内置安全主体”,查找位置为当前的服务器)


选择权限:本地启动、本地激活


错误二:Microsoft Office Excel cannot access the file “xxx.xls”

当修复了错误一后,兴冲冲地点击按钮,盼望着按钮的文字变成 “OX”,但结果却变成了另一个错误信息:

Microsoft Office Excel cannot access the file “xxx.xls”。 There are several possible reasons: • The file name or path does not exist. • The file is being used by another program. • The workbook you are trying to save has the same name as a currently open workbook.

同样使用 Visual Studio 的调试器附加到 w3wp.exe 之后,发现这次报错的地方不一样了,这也证明了,我们确实已经解决了第一个错误。

红框内的就是出错的地方


解决方案

这个错误信息相当让人困惑,因为你会发现这个文件存在且可以正常访问,而且也没有任何其它进程在使用这个文件。解决这个错误的办法比较奇葩,但确实可行。

1、在 C:\Windows\SysWOW64\config\systemprofile 目录下创建一个 Desktop 的文件夹。(如果是 32 位系统,那么你的路径应该是 C:\Windows\System32\config\systemprofile)

2、把 运行网站的用户 添加到该文件夹的用户组中,用户权限默认即可。


现在在点击按钮,那么一切就正常了。


错误三:The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.

很多朋友在代码中可能会操作 ODBC 去查询 Excel 中的数据,这个时候你很可能会遇到如下错误:

The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.

之所以会发生这个问题是因为IIS运行在 64 位上,而这个 ODBC 组件却只支持 32 位的,因此会提示如上错误。微软在去年刚推出了 64 位版本的 ODBC 解决方案,如果有需要,可以直接下载安装

本文不打算下载一个新的,因为还有一个方案更简单,就是让我们的网站运行在 32 位的环境下,你要做的只是需要在应用程序池的高级设置中,将 “Enable 32-bit application” 设为 “True” 即可。


这种方式,简单粗暴,但是如果网站中的部分功能依赖于 64 位系统,这可能会导致问题,那就只能下载一个最新版的 ODBC 了。


更多资源

服务器端 Office 自动化注意事项

文章索引

[隐 藏]

本站采用知识共享署名 3.0 中国大陆许可协议进行许可。 ©2014 Charlie Box | 关于本站 | 浙ICP备13014059号