在Winform中,运用using Excel = Microsoft.Office.Interop.Excel;引用EXCEL,完了发现进程中多了好多excel的进程,找了一些资料,说把跟EXCEL有关的全部做以下处理,就把以下代码写到了winform 的formClosing事件里,可是还是出现EXCEL的进程 ,在以下代码做了断电,好像不执行,不知道哪里的问题,请大家帮忙~System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(ep);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(ew);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(mySheet);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheets);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);            excel = null;
            ep = null;
            range = null;
            ew = null;
            mySheet = null;
            worksheets = null;
            workbooks = null;
            workbook = null;
            sheet = null;
            GC.Collect();

解决方案 »

  1.   

    调用excel.Close或者Quit应该就退出了吧怎么那么麻烦
      

  2.   

    除了以上的
    workbook调用close
    app调用Quit再不行就强行关进程吧
      

  3.   


    我试过了,app的Quit方法就可以退出不过,如果修改了内容,会弹出对话框,提示是否保存。可以设置app不显示Alter
      

  4.   

    if (workbook != null)
                    workbook.Close(true, _path + "/" + _filename, m_oMissing);            // Quit Excel and clean up.
                if (worksheet != null)
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
                worksheet = null;
                if (workbook != null)
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                workbook = null;
                if (workbook != null)
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
                workbook = null;
                if (App != null)
                {
                    App.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(App);
                    int iProcessID = 0;
                    String sProcessName = "";
                    System.Diagnostics.Process[] pTemp;
                    pTemp = System.Diagnostics.Process.GetProcesses();
                    foreach (System.Diagnostics.Process pTempProcess in pTemp)
                    {
                        sProcessName = pTempProcess.ProcessName;
                        iProcessID = pTempProcess.Id;
                        //将EXCEL改成你需要检测的程序名,不要加exe
                        if (sProcessName.CompareTo("EXCEL") == 0)
                        {
                            pTempProcess.Kill();
                            pTempProcess.Close();
                            //   break;
                        }
                    }
                    App = null;
                }
      

  5.   

    这个问题可以按照下面所说基本解决
    1.停止使用某个对象时,应使用 System.Runtime.InteropServices.Marshal.ReleaseComObject。这样可以减少 RCW 的引用计数。 
    2。要释放对变量的引用,请将变量设置为等于 Nothing 或 Null。 
    3.使用 Office 应用程序对象的 Quit 方法通知服务器关闭。 关于第二点做点解释,比如如果你通过wookbooks add了个workbook,你得
    books= workbooks;
    book = workbooks.Add();
    这样释放的时候你才可以方面的把books和book都置为null.不然直接book = Excel.Workbooks.Add();这个workbooks是没办法置为null的了。如果通过上面的内存中还有残留,就是所谓的"僵尸程序了",是RCW造孽,不好整了,不过没什么影响
      

  6.   

     excel.ActiveWorkbook.SaveAs(strExcelFileName + "\\" + timeFlag + ".xls", Excel.XlFileFormat.xlExcel9795, null, null, false, false, Excel.XlSaveAsAccessMode.xlNoChange, null, null, null, null, null);
                    workBook.Close(false, strExcelFileName, Type.Missing);
                    excel.Quit();
                    excel = null;                GC.Collect();//垃圾回收                Process[] myProcesses;
                    DateTime startTime;
                    myProcesses = Process.GetProcessesByName("Excel");
                    //得不到Excel进程ID,暂时只能判断进程启动时间
                    foreach (Process myProcess in myProcesses)
                    {
                        startTime = myProcess.StartTime;                    if (startTime < beforeTime && startTime < afterTime)
                        {
                            myProcess.Kill();
                        }
                    }