用ASP.NET进行Excel操作,主要问题集中在两点:
1、 运行权限
1) Web.config中:<identity impersonate="true"/>
2) 管理工具>组件服务>计算机>我的电脑>DCOM配置>Microsoft Excel Application>右键>属性>安全
a. 启用和激活权限>自定义>添加IUSR_XXX>勾上本地启动和本地激活权限
b. 访问权限>自定义>添加IUSR_XXX>勾上本地访问权限
2、 Excel进程的关闭
a) 在打开或者新建excel,word的时候,先将当前进程里的word,excel进程的ID记录下来(这些有可能是属于用户已经打开的word或者excel进程,最后删除的时候这些进程是不能kill掉的)
//
在打开excel前,将系统里面已经存在的excel进程进程ID保存起来
List
<
int
>
intList
=
new
List
<
int
>
();
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
foreach
(System.Diagnostics.Process p
in
System.Diagnostics.Process.GetProcesses())
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
if (p.ProcessName.ToUpper() == "EXCEL")
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
intList.Add(p.Id);
}
}
b) 进行excel操作
Application app
=
new
Application();
Workbook workbook
=
app.Workbooks.Open(FileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
Worksheet worksheet
=
(Worksheet)workbook.Worksheets[
1
];
workbook.Close(Type.Missing, Type.Missing, Type.Missing);
app.Quit();
c) 关闭就是如何关闭刚才新建的excel进程
//
先用系统提供的方法对系统资源释放,这种做法是大家常用的方法
System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
GC.Collect();
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
以下是我的新方法,如果还对象还没有释放的话kill掉新线程
if
(app
!=
null
)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//先判断当前进程是否是excel
if (p.ProcessName.ToUpper() == "EXCEL")
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//需要判断这个进程是用户打开的还是属于新建的进程,如果用户没有打开过excel,则直接kill掉这个进程
if (intList != null && intList.Count > 0)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
//用来标志是否是程序新建的
bool bNewID=true;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
foreach (int existId in intList)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (existId == p.Id)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
bNewID = false;
break;
}
}
//如果没有匹配到的话,说明是程序新建的,则删除他
if (bNewID == true)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
p.Kill();
}
}
//之前没有打开过excel进程,则直接kill掉他
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
p.Kill();
}
}
}
}
Excel进程关闭抄自:http://www.cnblogs.com/farrell/archive/2008/01/25/1053349.html,版权归原作者。