关于杀死窗体自身创建的Excel 进程,而不影响其他
前置感谢 http://www.cppblog.com/colys/archive/2009/02/09/25265.html#Post
困扰很久的事情,vb.net 或者C# 处理完excel 后,总会在进程中残留一个Excel 进程,从最开始的硬退窗体,到后面的全部杀死进程,总之一言难尽。
Process[] ExcelProcess = Process.GetProcessesByName("Excel");//关闭进程 foreach (Process p1 in ExcelProcess) { p1.Kill(); }
以上是杀死全部Excel进程的代码,若要使用,需要引用 using System.Diagnostics;//process引用
下面是,关闭窗体自身创建的Excel进程,
网上很多,自己总弄不好,直到看到前置感谢的,才把自己的弄好,记录下,备用
1 using System.Runtime.InteropServices;//杀进程DllImport引用 2 3 [DllImport("User32.dll", CharSet = CharSet.Auto)] 4 public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID); 5 //以上2行,为杀Excel进程,可以单独放程序入口 6 7 以下为一个按钮 的事件 8 private void button21_Click(object sender, EventArgs e) 9 { 10 saveFileDialog1.Title = "选择保存格式"; 11 saveFileDialog1.Filter = "Excel07|*.xlsx|Excel 03|*.xls"; 12 if (saveFileDialog1.ShowDialog() == DialogResult.OK) 13 { 14 15 Excel.Application xlApp = new Excel.Application(); 16 Excel.Workbook xlBook = xlApp.Workbooks.Add(true); 17 Excel.Worksheet st1 = (Excel.Worksheet)xlBook.Worksheets[1]; 18 19 //以下收集创建的EXCEL进程句柄 20 IntPtr t = new IntPtr(xlApp.Hwnd); 21 int k = 0; 22 GetWindowThreadProcessId(t, out k); 23 System.Diagnostics.Process p = System.Diagnostics.Process.GetProcessById(k); 24 //以上收集创建的EXCEL进程句柄 25 26 for (int c = 0; c<dataGridView1.Columns.Count;c++) 27 { 28 st1.Cells[1, c + 1].value = dataGridView1.Columns[c].HeaderText.ToString(); 29 } 30 31 for (int r = 0; r < dataGridView1.Rows.Count - 1; r++) 32 { 33 st1.Cells[r + 2, 1].value = "'" + dataGridView1.Rows[r].Cells[0].Value.ToString(); 34 st1.Cells[r + 2, 2].value = dataGridView1.Rows[r].Cells[1].Value.ToString(); 35 } 36 37 st1.Columns.AutoFit();//自动列宽 38 xlApp.ActiveCell.HorizontalAlignment = Excel.Constants.xlCenter; 39 st1.SaveAs(saveFileDialog1.FileName); 40 41 xlBook.Close(); 42 p.Kill(); 43 xlBook = null; 44 xlApp = null; 45 46 }
注意事项,句柄的收集,必须在建立你Excel之后,销毁之前,不然报错!!!
其实网上有很多这个例子,一并感谢我看过的。