.NET引用Excel操作时无法关闭Excel.exe进程的解决方法

在使用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();
        }


 以上资源释放时缺少一种、释放次序错误或未手动调用GC都会导致Excel进程驻留在系统中。 


  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值