Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
            if (app == null)
            {
                MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");
                return;
            }
            try
            {
                app.Visible = false;
                Workbook wBook = app.Workbooks.Add(true);
                Worksheet wSheet = wBook.Worksheets[1] as Worksheet;                
                app.DisplayAlerts = false;//保存Excel的时候,不弹出是否保存的窗口直接进行保存
                ////..............................................
                app.AlertBeforeOverwriting = false;
                wBook.Save();//保存工作簿
                string cTemp = DateTime.Now.Year + "-" + DateTime.Now.Month + "-" + DateTime.Now.Day;
                //app.Save(filePath + filename + cTemp + ".xls");//保存excel文件
                wBook.Saved = true;
                wBook.SaveCopyAs(filePath + filename + cTemp + ".xls");
                //WZ.BLL.Common.ToolUtils.nOpenStatus = true;
            }
            catch (Exception ex)
            {
                //WZ.BLL.Common.ToolUtils.nOpenStatus = true;
                MessageBox.Show("异常:" + ex.ToString());
            }
            finally
            {
                if (app != null)
                {
                    app.Quit();
                    app = null;
                }
            }
为何任务管理器里有很多Excel.exe进程啊

解决方案 »

  1.   

    加上wBook.Close(); 看看先把工作簿关闭了,再释放Excel的Application。
      

  2.   

    你将关于Excel的操作放在一个函数中实现,调用此函数后紧接着加上GC.Collect();语句就行了
      

  3.   

    直接杀进程  if (xlApp != null)
      {      if (xlApp.ActiveWorkbook != null)
          {
              xlApp.ActiveWorkbook.Close(false, Type.Missing, Type.Missing);
          }           xlApp.Quit();   //杀进程
    IntPtr t = new IntPtr(xlApp.Hwnd);
                int k = 0;
                GetWindowThreadProcessId(t, out k);
               System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
               p.Kill();
                }          
       GC.Collect();//调用系统的api  上边代码用的
    [DllImport("User32.dll", CharSet = CharSet.Auto)]
            private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
      

  4.   

    不过我发现 一个问题我是多线程调用  一个线程生成文件结束 回收(这里的回收把所有的Excel.ex都回收了)
    那其他线程 就没有办法生成Excel文件了  
      

  5.   

    msdn的解决方法:http://support.microsoft.com/kb/317109
      

  6.   

    调用的Excel是个com组件,最好不要用GC去处理,会有很多问题
    Com组件是根据引用计数器来选择关闭的,每引用一次,计数器加1,每释放一次,计数器减1。当计数器为0时,才会真正释放。所以每次引用workBook都要关闭,不然引用计数器不会清零,就不会真正释放
      

  7.   

                    if (wBook!=null)
                    {
                        wBook.Close(true, Temp+".xls", false);
                    }
    关掉后 还是总有一个Excel.exe存在  是不是我这里关的有问题啊
      

  8.   


                Excel.Workbook wBook = null;
                Excel.Worksheet wSheet = null;
                string cTemp = string.Empty;
                Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
                if (app == null)
                {
                    return;
                }
                try
                {
                    app.Visible = false;
                    wBook = app.Workbooks.Add(true);
                    wSheet = wBook.Worksheets[1] as Excel.Worksheet;
                    app.DisplayAlerts = false;//保存Excel的时候,不弹出是否保存的窗口直接进行保存
                    ////..............................................
                    app.AlertBeforeOverwriting = false;
                    wBook.Save();//保存工作簿
                    cTemp = DateTime.Now.ToString("yyyy-MM-dd");
                    //app.Save(filePath + filename + cTemp + ".xls");//保存excel文件
                    wBook.Saved = true;
                    wBook.SaveCopyAs(@"D:\" + cTemp + ".xls");
                    //WZ.BLL.Common.ToolUtils.nOpenStatus = true;
                }
                catch (Exception ex)
                {            }
                finally
                {
                    if (wBook != null)
                    {
                        wBook.Close(true, @"D:\" + cTemp + ".xls", false);
                    }
                    if (app != null)
                    {
                        app.Quit();
                        app = null;
                    }
                }
    根据你那个代码改的,我这里运行后没有留下Excel.exe的进程啊
    你的程序是不是Asp.net的程序啊?如果是Asp.net的话,那么是会留下一个Excel的进程的,这个进程在IIS的应用程序池关闭时一起关闭,或者在你本地调试的时候,在停止右下方状态栏中的本地Server时一起关闭
      

  9.   

    好的  是form  我试试看 谢谢哦
      

  10.   

    以上的解决方法都会有问题,这是调用com对象的正常现象,只有杀进程才可以。