Chinaunix首页 | 论坛 | 博客
  • 博客访问: 12400596
  • 博文数量: 1293
  • 博客积分: 13501
  • 博客等级: 上将
  • 技术积分: 17974
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-08 18:11
文章分类

全部博文(1293)

文章存档

2019年(1)

2018年(1)

2016年(118)

2015年(257)

2014年(128)

2013年(222)

2012年(229)

2011年(337)

分类: 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退出调试。

image

 

参考文献:

http://bbs.csdn.net/topics/390898375

http://www.cnblogs.com/yatasoft/archive/2008/08/06/1261969.html

阅读(2315) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~