悟生慧

 

根据Excel线程句柄得到ID并且关闭进程

[System.Runtime.InteropServices.DllImport("User32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        private static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
        private void Kill(Microsoft.Office.Interop.Excel.Application excel)
        {
            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
        }

 

 

GC.Collect的代码是:

 

/// <summary>
        /// 读取xls(用GC的方法,手工设置book为null)
        /// </summary>
        private void ReadXlsGetRangeA1()
        {
            string path = "C:\\abc.xls";

            // 判断文件不存在,返回
            if (!File.Exists(path))
            {
                return;
            }

            Excel.Application excel = new Excel.ApplicationClass(); // 某人
            //Excel.Workbooks workbooks = null; // 不用单独定义也可以
            Excel.Workbook book = null;
            Excel.Worksheet sheet = null;
            Excel.Range range = null;
            object oV = System.Reflection.Missing.Value; // 反复用到

            try
            {
                // 步骤1:打开某人的表xls
                book = excel.Workbooks.Open(path, oV, oV, oV, oV,
                    oV, oV, oV, oV, oV, oV, oV, oV, oV, oV); // 打开一个工作簿
                sheet = (Excel.Worksheet)excel.ActiveSheet;// 获取当前工作表
                sheet.Name = "Salary详细"; // 修改工作表的名字
                excel.Visible = false;

                // 步骤2:读取数据
                range = sheet.Cells.get_Range("A1", "A1"); //读取第一行第一列的内容
                this.Text = range.Value2.ToString(); // 现在是form的标题

                // 步骤3:保存表格
                book.Save();

                // 步骤4:关闭book
                excel.Workbooks.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
                System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
                book = null;
                sheet = null;
                range = null;
                excel = null;
                GC.Collect(); // 前提是:所有的对象都=null后才能调用此函数,然后才会结束“任务管理器”中的excel.exe进程
            }
        }

 

用Kill的方法的代码是:

using System.Runtime.InteropServices; // DllImport用

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

 

/// <summary>
        /// 读取xls(用kill的方法)
        /// </summary>
        private void KillReadXlsGetRangeA1()
        {
            string path = "C:\\abc.xls";

            // 判断文件不存在,返回
            if (!File.Exists(path))
            {
                return;
            }

            Excel.Application excel = new Excel.ApplicationClass(); // 某人
            //Excel.Workbooks workbooks = null; // 不用单独定义也可以
            Excel.Workbook book = null;
            Excel.Worksheet sheet = null;
            Excel.Range range = null;
            object oV = System.Reflection.Missing.Value; // 反复用到

            try
            {
                // 步骤1:打开某人的表xls
                book = excel.Workbooks.Open(path, oV, oV, oV, oV,
                    oV, oV, oV, oV, oV, oV, oV, oV, oV, oV); // 打开一个工作簿
                sheet = (Excel.Worksheet)excel.ActiveSheet;// 获取当前工作表
                sheet.Name = "Salary详细"; // 修改工作表的名字
                excel.Visible = false;

                // 步骤2:读取数据
                range = sheet.Cells.get_Range("A1", "A1"); //读取第一行第一列的内容
                this.Text = range.Value2.ToString(); // 现在是form的标题

                // 步骤3:保存表格
                book.Save();

                // 步骤4:关闭book
                excel.Workbooks.Close();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            finally
            {
                excel.Quit();
                //excel = null; // 注意:如果要获得excel的Hwnd,不能设置excel = null。

                IntPtr t = new IntPtr(excel.Hwnd);
                int k = 0;
                GetWindowThreadProcessId(t, out k);
                System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k);
                p.Kill();
            }
        }

 

Path.GetFileNameWithoutExtension() //返回不具有扩展名的指定路径字符串的文件名。
Path.GetTempFileName() //创建磁盘上唯一命名的零字节的临时文件并返回该文件的完整路径

posted on 2013-08-02 10:45  悟生慧  阅读(2147)  评论(1编辑  收藏  举报

导航