转: ASP.Net call Excel

来源:互联网 发布:nginx 锁定域名 编辑:程序博客网 时间:2024/06/07 16:40

转自:http://www.cnblogs.com/xuanhun/archive/2010/04/29/1724500.html

 

。。。

 

四. "未将对象引用设置到对象实例"和服务器端部署

客户端一切运行正常,接下来就是要把DLL部署到服务器上。可是服务器根本没用安装Office,在网站找了很久,也没找到此种方法的解决方案。无奈就安装了Office,本来以为万事大吉,但是每次都提示"未将对象引用设置到对象实例"。采用抛异常的方法才知道示例程序中的几个主要字段都为空,那就是本地的COM根本没调用成功。找到http://www.cnblogs.com/Mainz/archive/2009/11/11/microsoft_office_interop_excel.html文章,于是乎又进行了如下操作。

从服务器上把EXCEL.EXE拷到了本机上,然后从VS2010的命令行启动TlbImp,执行命令:TlbImp /out:Interop.Excel.dll Excel.exe。生成Interop.Excel.dll

在项目中去除了Microsoft.Office.Interop.Excel.dll的引用,添加Interop.Excel.dll,将顶部的using Excel=Microsoft.Office.Interop.Excel,该为using Excel= Interop.Excel,本地运行程序没有问题。再次更新服务器端程序,结果又出了新的异常:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80080005

五. "80080005异常"与权限配置

"80080005异常"是应用程序对COM组件操作权限不足引起的。于是有了下面的操作:

1)控制面板->管理工具->组件服务->计算机->我的电脑->DCOM-> Microsoft Excel 应用程序

2)单击属性打开此应用程序的属性对话框。

3) 单击标识选项卡,然后选择交互式用户。

4) 单击默认安全性选项卡。设置当前服务器与ASP.NET相关的用户的访问权限。

5)单击启动权限的编辑默认值。设置ASP.NET相关的用户的访问权限。

至此,程序才运行成功,可谓一波三折。

六.关闭Excel进程

如果使用这种方式用户每导出一个Excel文件,服务器端就会启动一个Excel进程。这回引起两个问题,一是耗费服务器资源,二是当进程数达到上限时,会引发异常,调用COM失败。这个时候要想办法结束Excel进程。我采用了杀进程的方式,类似下面的做法:

private void DoExcel()
{
Microsoft.Office.Interop.Excel.Application application = new Microsoft.Office.Interop.Excel.Application();
//这里释放所有引用的资源
application.Quit();
KillExcel(application);
}

[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd,out int ID);
public static void KillExcel(Microsoft.Office.Interop.Excel.Application excel)
{
IntPtr t = new IntPtr(excel.Hwnd); //得到这个句柄,具体作用是得到这块内存入口

int k = 0;
GetWindowThreadProcessId(t, out k); //得到本进程唯一标志k
System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); //得到对进程k的引用
p.Kill(); //关闭进程k
}

 

 

七.还有其他选择

生成Excel方式不止一种,比如利用OpenXml,还是留给你们导论吧,我向你们学习。

 

 

原创粉丝点击