问题描述
从dategrid中导出数据到EXCEL中,导出后EXCEL处于打开状态,将其关闭,桌面上EXCEL显示已经关闭。但是任务管理器中还存在这个EXCEl的进程!怎么将任务管理器中EXCEL进程同时关闭?
解决方案
解决方案二:
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsFile)GC.Collect()//其中xlsFile是个com的Object
解决方案三:
可能对象没有销毁!!用GC!!
解决方案四:
privatevoidKillProcess(stringprocessName){System.Diagnostics.Processmyproc=newSystem.Diagnostics.Process();//得到所有打开的进程try{foreach(ProcessthisprocinProcess.GetProcessesByName(processName)){if(!thisproc.CloseMainWindow()){thisproc.Kill();}}}catch(ExceptionExc){msg.Text+="杀死"+processName+"失败!";}}
解决方案五:
我只要关闭当前的这一个EXCEL即可,不能关闭所有的EXCEl进程
解决方案六:
不知道你的是桌面程序还是web程序.你到网上找一个好点Excel导出的方法,网上很多的!有不占用进程的.
解决方案七:
一直被一个问题困扰就是导出excel时如何关闭excel进程,我使用过oExcelApp.Quit();也用过GC回收,结果都不理想,后来发现可以kill进程,但是问题是kill进程时不好解决多人并发的使用,比如一个人在导表然后kill所以的excel但是如果同时又有人在导表那么这就把另外一个excel结束了,现在我们要办的是如何kill当前这个进程,这里我们先看一下代码:oExcelApp.Quit();oExcelApp=null;PublicMethod.Kill(oExcelApp);//调用kill当前excel进程PublicMethod.Kill()内容是:usingSystem.Runtime.InteropServices;publicclassPublicMethod{publicPublicMethod(){////TODO:在此处添加构造函数逻辑//}[DllImport("User32.dll",CharSet=CharSet.Auto)]publicstaticexternintGetWindowThreadProcessId(IntPtrhwnd,outintID);publicstaticvoidKill(Excel.Applicationexcel){IntPtrt=newIntPtr(excel.Hwnd);//得到这个句柄,具体作用是得到这块内存入口intk=0;GetWindowThreadProcessId(t,outk);//得到本进程唯一标志kSystem.Diagnostics.Processp=System.Diagnostics.Process.GetProcessById(k);//得到对进程k的引用p.Kill();//关闭进程k}}这样我们就可以关闭当前进程excel而不是杀掉所有的类型为excel进程了,------------------------------------------------------------------------------找到了一个这样的但运行时告诉我excel.Hwnd出错
解决方案八:
我的是桌面程序,不知道获得进程的句柄需要权限吗?不是管理员权限不能得到这个句柄吗?
解决方案九:
已经销毁了......
解决方案十:
引用1楼tianrui456的回复:
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlsFile)GC.Collect()//其中xlsFile是个com的Object
解决方案十一:
这些已经写过了
解决方案十二:
太深奥了
解决方案十三:
它不能关闭自己所在的内存,所以,你用关闭后,可能还不成功。把这个功能写在一个方法F,然后另写一个方法调用F,调用GC内存强制回收
解决方案十四:
想问你一下我想取得EXCEL的句柄该怎么做啊下面的方法:usingSystem.Runtime.InteropServices;publicclassPublicMethod{publicPublicMethod(){////TODO:在此处添加构造函数逻辑//}[DllImport("User32.dll",CharSet=CharSet.Auto)]publicstaticexternintGetWindowThreadProcessId(IntPtrhwnd,outintID);publicstaticvoidKill(Excel.Applicationexcel){IntPtrt=newIntPtr(excel.Hwnd);//得到这个句柄,具体作用是得到这块内存入口intk=0;GetWindowThreadProcessId(t,outk);//得到本进程唯一标志kSystem.Diagnostics.Processp=System.Diagnostics.Process.GetProcessById(k);//得到对进程k的引用p.Kill();//关闭进程k}}老是报错说是excel.Hwnd无效......不知道怎么回事??很是郁闷......
解决方案十五:
使用COM要注意“用完即释放”原则。你用excel会有那些applicationbooksheet之类的,用完之后,全部释放掉,在任务管理器就看不到它了。Marshal.ReleaseComObject(excelApp);excelApp=null;..........