主题:[求助]紧急!!EXCEL的关闭问题。
yuanpu111
[专家分:0] 发布于 2006-09-14 17:07:00
用C#操作EXCEL,使用
objExcel = Marshal.GetActiveObject("Excel.Application");
或
Excel.Application app = new Excel.Application();
打开excel,然后打开一个workbook进行操作。然后由用户关闭excel。
这时候excel进程不会关闭,在任务管理器的进程中仍然可以看到,而且使用allProcesses[i].MainWindowTitle 得知主窗口还在!导致再次启动时一些业务上问题的产生。
请问怎么办?如何在打开excel后令程序与excel完全脱离关系,使用户可以顺利的关闭!
谢谢高手!!!帮帮忙吧!!!
回复列表 (共4个回复)
沙发
yuanpu111 [专家分:0] 发布于 2006-09-14 17:08:00
在线等!!!
板凳
cipc [专家分:2280] 发布于 2006-09-14 18:55:00
在操使用作EXCEL时,我们是可以用Quit()来退出的,但是由于使用的是COM,所以即使使用Quit()也是不能从驻留在内存进程中清除,而且每实例化一个EXCEL会多出一个进程。我在网上看到用KILL()的方面,虽然可行,可是有可能会出现杀错进程的情况。因此我还是比较推荐使用
myGeneration = System.GC.GetGeneration(myExcel);
System.GC.Collect(myGeneration);
垃圾回收方法,同样也可以关闭进程的效果。
3 楼
yuanpu111 [专家分:0] 发布于 2006-09-14 19:35:00
谢谢楼上的高手!但问题是excel是由客户手动点击窗口的X关闭的,并不是由程序执行quit关闭的,怎么办?
4 楼
yuanpu111 [专家分:0] 发布于 2006-09-15 16:36:00
问题已经解决,使用
private bool hasExcelOpened ()
{
Process[] allProcesses = Process.GetProcessesByName("Excel");
if (allProcesses.Length != 0)
{
for (int i=0; i<allProcesses.Length; i++)
if (!allProcesses[i].MainWindowTitle.Trim().Equals("Microsoft Excel"))
{
if (allProcesses[i].MainWindowTitle.Trim().Equals(""))
allProcesses[i].Close();
else
return true;
}
return false;
}
else
return false;
/*Object objExcel;
objExcel = Marshal.GetActiveObject("Excel.Application");
if (objExcel == null)
MessageBox.Show(objExcel.ToString());
else
MessageBox.Show(objExcel.ToString());
return true;*/
}
关闭主窗口关闭,但仍然在内存中的excel,此时主窗口的title为空串。
我来回复