根据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() //创建磁盘上唯一命名的零字节的临时文件并返回该文件的完整路径