首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

excel导出过程无法关闭

2013-06-19 
excel导出进程无法关闭我现在用C#写了一个winform应用程序,我现在是用线程导出Excel数据。数据可以成功导出

excel导出进程无法关闭
我现在用C#写了一个winform应用程序,我现在是用线程导出Excel数据。数据可以成功导出,但是在任务管理器里的excel.exe进程就是无法随着数据导出结束而结束,怎么办呢?每导出一份数据就多一个excel.exe进程,郁闷
[解决办法]


/// <summary>
        /// 预关闭未退出的Excel进程方法
        /// </summary>
        public void PreExitExcel()
        {
            System.Diagnostics.Process[] allProcess = System.Diagnostics.Process.GetProcesses();
            foreach (System.Diagnostics.Process thisprocess in allProcess)
            {
                string processName = thisprocess.ProcessName;
                if (processName.ToLower() == "excel")
                {
                    try
                    {
                        thisprocess.Kill();
                    }
                    catch (Exception e)
                    {
                        MessageBox.Show(e.Message);
                        return;
                    }
                }
            }
        }

[解决办法]
 我一直都这样做,很有用的:
 [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
private static void killExcel(Microsoft.Office.Interop.Excel.Application excel)
        {
            Process[] ps = Process.GetProcesses();
            IntPtr t = new IntPtr(excel.Hwnd); //得到这个句柄,具体作用是得到这块内存入口 


            int ExcelID = 0;
            GetWindowThreadProcessId(t, out ExcelID); //得到本进程唯一标志k
            foreach (Process p in ps)
            {
                if (p.ProcessName.ToLower().Equals("excel"))
                {
                    if (p.Id == ExcelID)
                    {
                        p.Kill();
                    }
                }
            }

        }
[解决办法]
关闭excel进程的类和方法


public class KillMyExcelProcess
    {
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
        public static void Kill(Microsoft.Office.Interop.Excel.Application excel)
        {
            try
            {
                IntPtr t = new IntPtr(excel.Hwnd);   //得到这个句柄,具体作用是得到这块内存入口 

                int k = 0;
                GetWindowThreadProcessId(t, out k);   //得到本进程唯一标志k
                System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);   //得到对进程k的引用

                p.Kill();     //关闭进程k
            }
            catch (Exception ex)
            {
                log4net.ILog objLogger_se = log4net.LogManager.GetLogger("SystemExceptionLogger");
                objLogger_se.Fatal("System Exception Close Excel  " + ex.Message + "Inner Message:" + ex.InnerException.Message + DateTime.Now.ToString());


                throw ex;
            }
        }
    }


应用程序中关闭excel的方法

public void CloseExcel(Microsoft.Office.Interop.Excel.Application ExcelApplication, Microsoft.Office.Interop.Excel.Workbook ExcelWorkbook)
        {
            ExcelWorkbook.Close(false, Type.Missing, Type.Missing);
            ExcelWorkbook = null;
            ExcelApplication.Quit();
            GC.Collect();
            KeyMyExcelProcess.Kill(ExcelApplication);
        }


两个一起用,应用程序里的内容可以自行修改

热点排行