回 帖 发 新 帖 刷新版面

主题:[求助]紧急!!EXCEL的关闭问题。

用C#操作EXCEL,使用
objExcel = Marshal.GetActiveObject("Excel.Application");

Excel.Application app = new Excel.Application(); 
打开excel,然后打开一个workbook进行操作。然后由用户关闭excel。
这时候excel进程不会关闭,在任务管理器的进程中仍然可以看到,而且使用allProcesses[i].MainWindowTitle 得知主窗口还在!导致再次启动时一些业务上问题的产生。
请问怎么办?如何在打开excel后令程序与excel完全脱离关系,使用户可以顺利的关闭!
谢谢高手!!!帮帮忙吧!!!

回复列表 (共4个回复)

沙发

在线等!!!

板凳

在操使用作EXCEL时,我们是可以用Quit()来退出的,但是由于使用的是COM,所以即使使用Quit()也是不能从驻留在内存进程中清除,而且每实例化一个EXCEL会多出一个进程。我在网上看到用KILL()的方面,虽然可行,可是有可能会出现杀错进程的情况。因此我还是比较推荐使用
myGeneration = System.GC.GetGeneration(myExcel);
System.GC.Collect(myGeneration);
垃圾回收方法,同样也可以关闭进程的效果。

3 楼

谢谢楼上的高手!但问题是excel是由客户手动点击窗口的X关闭的,并不是由程序执行quit关闭的,怎么办?

4 楼

问题已经解决,使用
        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为空串。

我来回复

您尚未登录,请登录后再回复。点此登录或注册