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进程。
[解决办法]
daochu_all(参数1,...,参数N);
GC.Collect();
[解决办法]
public void DestoryExcel()
{
oBook.Close( false, null, null );
oExcel.Workbooks.Close();
oExcel.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject( oRange );
System.Runtime.InteropServices.Marshal.ReleaseComObject( oWorkSheet );
System.Runtime.InteropServices.Marshal.ReleaseComObject( oSheet );
System.Runtime.InteropServices.Marshal.ReleaseComObject( oBook );
System.Runtime.InteropServices.Marshal.ReleaseComObject( oExcel );
oRange = null;
oWorkSheet = null;
oSheet = null;
oBook = null;
oMissing = null;
oExcel = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
[解决办法]
//保存并关闭
xlWorkbook.Close( Excel.XlSaveAction.xlDoNotSaveChanges, oMissing, oMissing );
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlWorkbook);
xlWorkbook = null;
[解决办法]
up
[解决办法]
手动用冰刃杀
[解决办法]
如果是WinForm程式的话
Excel.ApplicationClass exc = new Excel.ApplicationClass ();
if ( exc == null )
{
MessageBox.Show ( "ERROR: EXCEL couldn 't be started ");
}
Excel.Workbooks exBooks=null;
Excel._Workbook exBook=null;
Excel._Worksheet exSheet=null;
object mo=System.Reflection.Missing.Value;
try
{
exc=new Excel.ApplicationClass();
exBooks=exc.Workbooks;
exBook=exBooks.Open(ExcelFile.Text,mo,mo,mo,mo,mo,mo,mo,mo,mo,mo,mo,mo);
exSheet = (Excel._Worksheet)exBook.Worksheets[ "Equipments "];//Sheet1为你工作表的名称,也可以是数字,那就是你工作表的序号
....
}
catch( System.Exception exp)
{
MessageBox.Show (exp.Message );
}
finally
{
//exBook.Save();
exBook.Close(true,mo,mo);
exBooks.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(exSheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(exBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(exBooks);
exBooks=null;
exBook = null;
exSheet = null;
exc.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(exc);
exc = null;
GC.Collect();
}
就可以直接结束掉了.
如果是Web程式
System.DateTime begintime ; //启动之前的时间
System.DateTime afterTime; //启动之后的时间
在Excel对象初始化前记录启动之前的时间
//初始化
===========================================================================
begintime = System.DateTime .Now ;
Excel.ApplicationClass exc = null;
....
==========================================================================
操作完成后
=============================================================================
afterTime = System.DateTime .Now ; //启动之后的时间
//释放资源
KillExcelProcess(begintime,afterTime); //强行结束Excel进程
=============================================================================
KillExcelProcess()函数
public void KillExcelProcess(System.DateTime beginTime, System.DateTime afterTime)
{
try
{
System.Diagnostics.Process[] excelProcess = System.Diagnostics.Process.GetProcessesByName( "Excel ");
foreach(System.Diagnostics.Process process in excelProcess)
{
if (process != null)
{
if ( process.StartTime > beginTime && process.StartTime < afterTime )
{
process.Kill();
}
}
}
}
catch(System.Exception exp)
{
Response.Write ( " <script> alert( ' "+exp.Message + " '); </script> ");
}
}
[解决办法]
上面是我在WIN程式各web程式下结束Excel的主要代码,完全可以实现,不过在Web程式中要给用户加权限.
[解决办法]
要用模拟帐户执行
/// <summary>
/// 关闭进程
/// </summary>
/// <param name= "ProcessName "> </param>
public void KillProcess(string ProcessName)
{
try
{
try
{
System.Diagnostics.Process[] process;
process=System.Diagnostics.Process.GetProcessesByName(ProcessName.Trim());
foreach(System.Diagnostics.Process dProcess in process)
{
dProcess.Kill();
}
}
catch//(Exception ex)
{
//this.ShowMessage(ex.Message);
}
}
}
catch(Exception ex)
{
//throw new Exception(ex.Message);
}
}
}
[解决办法]
private void KillProcess(string processName)
{
Process[] a = System.Diagnostics.Process.GetProcessesByName(processName);//得到所有打开的excel进程
try
{
foreach (Process thisproc in a)
{
if (!thisproc.CloseMainWindow())
{
thisproc.Kill();
}
}
}
catch (Exception Exc)
{
throw (Exc);
}
}
[解决办法]
COM的玩意GC有时回收不了的.最彻底的办法就是KILLPROCESS, 但是你要在启新的EXCEL之前记录下现有的EXCEL的进程,不要误杀别的进程就行了.
这种方法虽然直接,但是很粗暴,如果有的COM对象还在做操作也会被无情地杀掉,不留下一片云彩...
[解决办法]
pProcess.Kill()
这个不行吗
[解决办法]
用KILLPROCESS,
System.DateTime begintime ; //启动之前的时间
System.DateTime afterTime; //启动之后的时间
可以防止Excel被误杀!详细请看我上面的留言!
[解决办法]
用KILLPROCESS,
System.DateTime begintime ; //启动之前的时间
System.DateTime afterTime; //启动之后的时间
可以防止Excel被误杀!详细请看我上面的留言!
---------------------
我也是用的这种方法:)
[解决办法]
private void CloseWorkbook(Excel.Workbook wbook)
{
foreach(Excel.Worksheet ws in wbook.Worksheets) {
Marshal.ReleaseComObject(ws);
}
wbook.Saved = true;
wbook.Close(false, false, 0);
Marshal.ReleaseComObject(wbook);
}
public void GetRidOfAllExcelWorkBooks()
{
excelApp.DisplayAlerts = false;
foreach (Excel.Workbook wb in excelApp.Workbooks)
{
CloseWorkbook(wb);
}
excelApp.Quit();
Marshal.ReleaseComObject(excelApp);
excelApp = null;
GC.Collect();
GC.WaitForPendingFinalizers();
}
[解决办法]
这里的方法
http://blog.csdn.net/net_lover/archive/2007/07/23/1702797.aspx
[解决办法]
这篇文章对你会有帮助,我实验过
http://blog.csdn.net/tongdoudpj/archive/2007/06/26/1667211.aspx
Good Luck !
Tony!
[解决办法]
学习,回学校试试楼上各位说的方法!!
[解决办法]
Mark
[解决办法]
/// <summary>
/// 退出系统杀进程
/// </summary>
private void KillProcess()
{
System.Diagnostics.Process CurrentProcess = System.Diagnostics.Process.GetCurrentProcess();
System.Diagnostics.Process[] AllProcess = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process p in AllProcess)
{
if (p.Id == CurrentProcess.Id)
p.Kill();
}
}
[解决办法]
GC.Collect() 并不涉及非托管资源
[解决办法]
LZ,没事你别乱GC.Collect()。这个有的时候反而会出大乱子。
而且,你的最终目的只是KILL掉EXCEL进程。这边大家都有很好的想法了。
另外
copico(北北)
你调用一个cmd来杀
tskill EXCEL.EXE 这个应该是taskkill 命令
还有。你可以参考用 Process.GetCurrentProcess中的.kill()方法。
前面很多的朋友都提到这种方法了。你可以先试一下。
或者,你可以先得到进程名,或者进程ID号。然后通过ID号,将他KILL掉。也是可以考虑的
[解决办法]
gBeforeProcessStartTime = Now.AddSeconds(-1);
Microsoft.Office.Interop.Excel.ApplicationClass EXL = new Microsoft.Office.Interop.Excel.ApplicationClass();
//增加1秒,避免两个时间重复!
gAfterProcessStartTime = Now.AddSeconds(1);
/// <summary>
/// 停止进程
/// </summary>
/// <param name= "processName "> 进程名称 </param>
/// <param name= "beforeStartTime "> 进程启动前的时间 </param>
/// <param name= "afterStartTime "> 里程启动后的时间 </param>
/// <remarks> </remarks>
public static void Kill(string processName, DateTime beforeStartTime, DateTime afterStartTime)
{
Process[] mProcessList;
DateTime mProcessStartTime;
mProcessList = Process.GetProcessesByName(processName);
foreach (Process tmpProcess in mProcessList) {
mProcessStartTime = tmpProcess.StartTime;
if (mProcessStartTime.CompareTo(beforeStartTime) > 0 && mProcessStartTime.CompareTo(afterStartTime) < 0)
{
tmpProcess.Kill();
}
}
}