C#关闭顽固的EXCEL.EXE进程

简介: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.

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

相关文章
|
3月前
|
SQL C# 数据库
EPPlus库的安装和使用 C# 中 Excel的导入和导出
本文介绍了如何使用EPPlus库在C#中实现Excel的导入和导出功能。首先,通过NuGet包管理器安装EPPlus库,然后提供了将DataGridView数据导出到Excel的步骤和代码示例,包括将DataGridView转换为DataTable和使用EPPlus将DataTable导出为Excel文件。接着,介绍了如何将Excel数据导入到数据库中,包括读取Excel文件、解析数据、执行SQL插入操作。
EPPlus库的安装和使用 C# 中 Excel的导入和导出
|
2月前
|
安全 API C#
C# 如何让程序后台进程不被Windows任务管理器强制结束
C# 如何让程序后台进程不被Windows任务管理器强制结束
70 0
|
3月前
|
SQL 网络协议 数据库连接
已解决:连接SqlServer出现 provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程【C#连接SqlServer踩坑记录】
本文介绍了解决连接SqlServer时出现“provider: Shared Memory Provider, error: 0 - 管道的另一端上无任何进程”错误的步骤,包括更改服务器验证模式、修改sa用户设置、启用TCP/IP协议,以及检查数据库连接语句中的实例名是否正确。此外,还解释了实例名mssqlserver和sqlserver之间的区别,包括它们在默认设置、功能和用途上的差异。
|
4月前
|
文字识别 C# Python
使用C#将几个Excel文件合并去重分类
使用C#将几个Excel文件合并去重分类
33 3
|
4月前
|
开发框架 算法 .NET
C#使用MiniExcel导入导出数据到Excel/CSV文件
C#使用MiniExcel导入导出数据到Excel/CSV文件
95 0
|
6月前
|
C#
【C#】C#读写Excel文件
【C#】C#读写Excel文件
140 1
|
5月前
|
C#
C#进程调用FFmpeg操作音视频
因为公司需要对音视频做一些操作,比如说对系统用户的发音和背景视频进行合成,以及对多个音视频之间进行合成,还有就是在指定的源背景音频中按照对应的规则在视频的多少秒钟内插入一段客户发音等一些复杂的音视频操作。本篇文章主要讲解的是使用C#进程(Process)调用FFmpeg.exe进行视频合并、音频合并、音频与视频合并成视频这几个简单的音视频操作。
|
7月前
|
存储 API C#
C# 实现格式化文本导入到Excel
C# 实现格式化文本导入到Excel