http://blog.csdn.net/hsyj_0001/article/details/7686364
在使用Office类库Microsoft.Office.Interop.Excel导入导出Excel文件操作后,即使调用Application的Quit()函数还是无法关闭Excel进程,在资源管理器中还是存在。
查询一些网上资料该问题终于解决了。具体步骤如下:
1.创建Excel的Application对象
2.获取Application的Workbooks对象集合
3.添加一个工作薄Workbook对象
4.获取该工作薄中的一个Worksheet对象
5.对该Worksheet对象中的Range对象进行操作。
6.调用Workbook对象的Save或SaveAs函数,保存工作簿
7.调用Workbook对象的Close函数,关闭该工作簿
8.调用Application对象的Quit函数,关闭整个Excel程序。
一般到这一步大家都以为处理结束,Excel进程会结束,但实际运行时,即使关闭整个应用程序Excel进程也不会关闭。在网上会见到一些解决方法枚举系统中所有的Excel进程,然后将其逐个杀死,但是这样可能会误杀一些用户开启的Excel进程。
其实,没有退出Excel进程的原因只是由于一些资源没有释放,所以必须要手动释放这些资源,并且要显式调用垃圾回收GC进行垃圾回收。只需要在以上第8步之后,增加一下操作。
9.调用System.Runtime.InteropServices.Marshal.ReleaseComObject依次释放Range、Worksheet、Workbook、Workbooks和Application对象。
10.调用GC的垃圾回收方法。
以上操作的代码如下:
private void button1_Click(object sender, EventArgs e)
{
String str = @"测试数据";
// 1.启动Excel进程
Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
excelApp.Visible = false;
// 2.获取Workbooks对象
Workbooks wbs = excelApp.Workbooks;
// 3.添加工作薄Workbook对象
Workbook wb = wbs.Add();
// 4.获取第一个工作表Workbook
Worksheet ws = (Worksheet)wb.Worksheets.Item[1];
// 5.获取单元格并设置文本
Range rng = (Range)ws.Cells[1, 1];
rng.Value = str;
rng = (Range)ws.Cells[2, 1];
rng.Value = str;
// 6.7 保存Excel文档并关闭
wb.SaveAs(@"C:\test.xls");
wb.Close();
// 8.退出Excel程序
excelApp.Quit();
// 9.释放资源
System.Runtime.InteropServices.Marshal.ReleaseComObject(rng);
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wbs);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApp);
// 10.调用GC的垃圾收集方法
GC.Collect();
GC.WaitForPendingFinalizers();
}
2019年8月因为调用WPS ET遇到同样的问题,而没上CSDN找答案,重新找,发现微软有相关的问题解答,泪啊。
找到相关文章:C# 调用Office Excel 接口方法Quit(),但是Excel进程不退出的解决办法,从文章中提到的“http://support.microsoft.com/kb/Q317109”通过查找“Q317109”找到这篇文章。 |
找到微软的相关问题解答:
Office application does not exit after automation from Visual Studio .NET client |