关于杀死窗体自身创建的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之后,销毁之前,不然报错!!!

其实网上有很多这个例子,一并感谢我看过的。

posted @ 2022-12-23 20:22  橙香夜雨  阅读(74)  评论(0编辑  收藏  举报