全部博文(1293)
分类: C#/.net
2015-07-29 10:47:30
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using EXCEL = Microsoft.Office.Interop.Excel;
namespace wireless_spectrum.CS
{
public class CPublicMethod
{
[DllImport("User32.dll", CharSet = CharSet.Auto)]
public static extern int GetWindowThreadProcessId(IntPtr hwnd, out int ID);
public static void Kill(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
}
}
}
应用场景:
Random rdm = new Random();
string fileName = "Excel" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";
string srcExcelPath = Application.StartupPath + "\\Excels\\Datas.xls";
string fileFullName = Application.StartupPath + "\\Datas\\" + fileName;
EXCEL.Application eApp = new EXCEL.Application();
eApp.DisplayAlerts = false;
EXCEL.Workbook workBook = eApp.Workbooks.Add(srcExcelPath);
EXCEL.Worksheet workSheet = eApp.ActiveSheet;
// 通道信号强度对照表
this.initExcelCell(workSheet, this.mMessListMF[0], 2, this.mHTChanPnls.Count);
this.fillChansToExcel(workSheet);
workBook.SaveCopyAs(fileFullName);
eApp.Quit();
CS.CPublicMethod.Kill(eApp);
eApp = null;
上述几句极为重要:
原因:其实excelApp.Quit();方法是可以正确的释放EXCEL进程的,我们导入导出EXCEL时,普遍方法是代码后台处理,前台并隐藏EXCEL界面,也就是excelApp.Visible = false (这是默认值,不设置的话也是False),当调用 excelApp.Quit()时,EXCELE会弹出个对话框,问你是否保存,而excelApp.Visible = false 时,保存对话框也一并隐藏掉了,所以EXCEL卡在了这个地方,造成了EXCEL不能正常释放进程.
解决方法:设置excelApp.DisplayAlerts = false,就是不提问任何提示,这样再关闭EXCEL对象时,就不会有保存提示,也就不会卡住了.
另外,使用此法处理关闭EXCEL调试时,不要轻易点击VS的停止调试按钮结束调试,不然很容易电脑蓝屏,原因不明!!!!!
应该点击程序右上角的X退出调试。
参考文献:
http://bbs.csdn.net/topics/390898375
http://www.cnblogs.com/yatasoft/archive/2008/08/06/1261969.html