很久没更新了,感觉有点对不起dudu给的帐户,所以最近做了一点点.NET相关的事情,马上写出来各位分享。

最近的一个项目,需要将数据写入到Excel文件中。这本不是一个困难的事情,但是有一个问题始终没有解决,就是调用Excel对象后,系统中会有一个Excel进程没有退出。我使用的是VS2003。

google了相关的内容,很多人都遇到了同样的问题。解决的方法是调用System.Runtime.InteropServices.Marshal.ReleaseComObject方法,然后将引用的对象赋值为null,并执行垃圾回收。

官方的文档,请参考下面的链接。
使用 Visual Studio .NET 客户端执行自动化功能后不退出 Office 应用程序

经过实验,上面文章的说法是有一定效果的,文中的重点就是要使用对象类型进行操作,并且为每个要引用的对象创建变量,而且一定要在使用后释放。
在实际使用中,这种程序是很难写的,为了一段很少的功能,写了很长的一段代码,而且经常找不到造成引用未释放的语句。(有的时候,我定义一个int类型的变量都会造成Excel无法退出,真是气晕了)

搞了几天,也没有完全搞清楚这种程序如何写。所以想到网上通常使用的另外一种方法,就是KILL。

网络上提供的例子,通常是Kill系统内的Excel进程,这种方法容易出问题。研究了一下,做了一点改善。通过进程的命令行参数判断是否是OLE调用产生的Excel进程。这种方法也有问题,比如同时使用两个调用Excel的程序的时候,容易误杀。所以在实际使用的时候,还要多根据进程的信息进行判断。
下面是代码,供参考。(很少写代码,粗陋之处,莫见笑,仅供参考)
关于.NET程序中使用Excel对象后,如何结束残留的Excel进程。private void KillExcelProcess()

好像还有一种方法可以区别OLE调用的Excel进程和正常调用的Excel进程。OLE调用的Excel进程的父进程是svchost,正常Excel进程的父进程是explorer。没有编码测试过。

另外,编写Excel相关的程序,总是找不到比较完善的例子和说明,也可能是使用msdn这部分还不熟。这里分享一个小方法。Office的程序通常都提供宏录制的功能,如果需要找某些功能需要调用的接口和方法,可以通过录制的宏的代码来得到这部分信息。接口和对象都是一样。

相关文章:

  • 2021-08-16
  • 2022-02-09
  • 2022-12-23
  • 2022-02-08
  • 2022-12-23
  • 2022-12-23
  • 2021-12-25
猜你喜欢
  • 2022-02-13
  • 2021-08-15
  • 2022-12-23
  • 2021-09-25
  • 2021-11-19
  • 2022-02-08
相关资源
相似解决方案