Excel.Application app = new Excel.Application();
            app.Application.DisplayAlerts = false;
            app.Visible = false;            Excel.Workbook tworkbook;
            Object missing = System.Reflection.Missing.Value;
            app.Workbooks.Add(missing);
            tworkbook = app.Workbooks.Open(mode.FullName, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);
            System.Data.DataTable dt = ds.Tables[0];
                   . 
                   .
                   . 
                   .
tworksheet.SaveAs(newpath, missing, missing, missing, missing, missing, missing, missing, missing, missing);
            tworkbook.Close(false, mode.FullName, missing);
            app.Workbooks.Close();
            app.Quit();
            if (app != null)//[color=#FF0000]此处必须要杀掉吗?
            {
                foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcessesByName("Excel"))
                {
                    //先判断当前进程是否是excel  
                    if (!p.CloseMainWindow())
                    {
                        p.Kill();
                    }
                }
            }[/color]            tworkbook = null;
            app = null;
            GC.Collect();
  。以上已经 app.Workbooks.Close();
            app.Quit();   了,还必须判断excel并杀掉进程吗?如果,不杀掉的话,excel进程会自动退出吗?经过测试,两个用户同时调用这里的时候,其中一个会出错,就是因为进程被杀掉了。

解决方案 »

  1.   

     app.Workbooks.Close();
                    app.Quit();
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
                    System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
                    sheet = null;
                    book = null;
                    app = null;
                    GC.Collect();
    private void KillProcess(string processName)
    {
    System.Diagnostics.Process myproc= new System.Diagnostics.Process();
    try{
    foreach (Process thisproc in Process.GetProcessesByName(processName)) {
    if(!thisproc.CloseMainWindow()){
    thisproc.Kill();
    }
    }
    }
    catch(Exception Exc)
    {
    }
     GC.Collect();
    }
      

  2.   

    谢谢1楼,
    现在的问题就是,不能按照excel名字来杀掉进程,不然的话,当其他用户也在调用该代码的时候,foreach杀掉excel进程的话,就会出错。我的意思就是我不强制调用杀掉excel进程是否可以(不会一直耗内存),如果不行的话,通过怎样判断来杀掉各自的excel进程,比如A用户杀掉A的,B用户杀掉B的。谢谢。
      

  3.   

    不用杀进程,但你要保证所有用到的excel对象都要设为null,哪怕是中间临时对象(即没有用变量声明通过其他对象间接调用的)都要声明变量,用完后设为null,只有这样最后app.Quit时才可保证进程正常退出