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进程。