日期:2014-05-19  浏览次数:20922 次

200分求够能杀掉excel进程的方法
//这个是我定义的操作EXCEL的两个对象:
Excel.Application   xlApp   =   new   Excel.Application();
Excel.Workbook   xlBook   =   xlApp.Workbooks.Add(userpath);
...   ...
//这个是我保存修改后的EXCEL:
xlApp.Application.DisplayAlerts   =   false;
xlBook.SaveAs(productpath   +   "\\BaselineProduct.xls ",   xlApp.ActiveWorkbook.FileFormat,   " ",   " ",   xlApp.ActiveWorkbook.ReadOnlyRecommended,   xlApp.ActiveWorkbook.CreateBackup,   XlSaveAsAccessMode.xlNoChange,   xlApp.ActiveWorkbook.ConflictResolution,   false,   " ",   " ",   " ");
//以下就是我杀EXCEL进程的方法:
if   (xlBook   !=   null)
{
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlBook);
        xlBook   =   null;
}
if   (xlApp   !=   null)
{
        System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);
        xlApp.Quit();
        xlApp   =   null;
}
GC.Collect();

用以上的方法会有2个问题:
1、在Debug状态下始终会有一个EXCEL进程,程序无法杀掉,但可以到任务管理器中用手动杀掉。
2、发布以后创建一个操作EXCEL的对象,任务管理器就会有多少EXCEL进程,而且这些进程还无法用手动杀掉,用手动杀提示信息为 "拒绝访问 "。

哪位大哥大姐有好的方法解决了我的问题另开帖再送100分,谢谢。


------解决方案--------------------
Dim pProcess As System.Diagnostics.Process

For Each pProcess In System.Diagnostics.Process.GetProcesses()
If pProcess.ProcessName.ToString() = "EXCEL " Then pProcess.Kill()
Next
------解决方案--------------------
把你杀进程的代码放到一个方法里面,然后调用该方法,在方法后面再进行垃圾收集。。
原来我也遇到这个问题,是这么解决的。。。。
------解决方案--------------------
最好是把你的操作excel的作为一个方法。。在方法调用之后进行垃圾收集。。
------解决方案--------------------
你调用一个cmd来杀
tskill EXCEL.EXE


------解决方案--------------------
你把垃圾收集都放在方法里面去了啊。。
要放在方法外面。。
------解决方案--------------------
二楼的方法也是可行的。。
但是可能会关闭原来用户打开的其他excel进程。。
------解决方案--------------------
我也碰到过,解决的方法和JoneG(琼琼) 说的一样,只是我是把所有excel操作放到一个方法里(包括xlApp.Quit();等),然后在方法外面再GC.Collect();
如 public voic excel操作处理(string path)
{
........
}

调用处
excel操作处理(strpath;
GC.Collect();
这样应该就可以了

------解决方案--------------------
如果还不行就加System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); 这句试试,就是加在xlApp.Quit();这句后面,一般我是不加这句的。

------解决方案--------------------
最好不要杀进程

public void aaa()
{
bbb();
System.GC.Collect(); //在这里调用垃圾收集
}

public void bbb()
{
操作excel();
该怎么处理还是怎么处理
}

就OK了
------解决方案--------------------
大哥 代码好长...
2003的么?
------解决方案--------------------
同意bitpolar(独自看天)的。。
里面不需要定义那个进程的东西。。。。
用你原来的代码,只是在daochu_all方法调用之后写个GC.Collect()就行了
------解决方案--------------------
告诉你一个方法:找到当前的execl进程ID,然后调用进程直接杀死它,这样就不会误杀其他的excel进程。