日期:2014-05-17  浏览次数:20677 次

关于KILL EXCEL进程问题
由于现在在做维护发现以前有段关于杀死EXCEL进程的代码是这样写的:

  finally
  {
  // 删除进程中 Excel.exe
  foreach (System.Diagnostics.Process theProc in System.Diagnostics.Process.GetProcessesByName("EXCEL"))
  {
  if (theProc.CloseMainWindow() == false)
  {
  theProc.Kill();
  }
  }
  }
这样其实很有问题,如果客户开了多个EXCEL会被一起KILL掉.有什么办法只把读进去的
那个EXCEL给KILL掉.

------解决方案--------------------
在你的程序调用完Excel后写

workbook.Close(false, Missing.Value, Missing.Value);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workbook);
xlApp.Quit();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlApp);
GC.Collect();
GC.WaitForPendingFinalizers();
------解决方案--------------------
C# code
   /// <summary>
        /// 导出Excel后,杀死Excel进程
        /// </summary>
        /// <param name="app"></param>
        private static void KillProcess(_Excel.Application app)
        {
            IntPtr t = new IntPtr(app.Hwnd);
            int k = 0;
            GetWindowThreadProcessId(t, out k);
            System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
            p.Kill();
        }

        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowThreadProcessId(IntPtr hwnd, out   int ID);

------解决方案--------------------
探讨
在你的程序调用完Excel后写

workbook.Close(false, Missing.Value, Missing.Value);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(workbook);
xlApp.Quit();
System.Runtime.InteropServices.Marshal.……

------解决方案--------------------
跟你说了文件打开跟这没关系

ThisApplication.Visible=false

才是决定是否显示的地方