.Net操作Excel后彻底释放资源
和同事在工作中遇到的:
在.net中,有时候需要对Excel文档进行操作,但通常我们并不能真正的正确释放Excel占用的资源。
我们在代码中通常会这样操作Excel
Dim excelWorkBook As Excel.Workbook
Dim excelWorkSheet As Excel.Worksheet
Dim appExcel As New Excel.Application
Dim excelRange As Excel.Rangge
…………
Dim excelWorkSheet As Excel.Worksheet
Dim appExcel As New Excel.Application
Dim excelRange As Excel.Rangge
…………
在操作完成后我们通常这样释放:
excelWorkBook.Close()
appExcel.Quit()
excelWorkSheet = Nothing
excelWorkBook = Nothing
appExcel = Nothing
……
appExcel.Quit()
excelWorkSheet = Nothing
excelWorkBook = Nothing
appExcel = Nothing
……
看起来很正确嘛。OK,请打开资源管理器,发现Excel的进程了吗?再运行几次你的程序,是不是发现Excel的进程越来越多了?相信你现在有点想骂人了吧。
正确的释放资源的方法是:
excelWorkBook.Close()
appExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel)
excelWorkSheet = Nothing
excelWorkBook = Nothing
appExcel = Nothing
……
System.GC.Collect(0)
这时候可以发现,Excel进程终于乖乖消失了。
PS:如果还不行的话,那就把你所有打开过的有关Excel的对象都用ReleaseComObject释放掉。
2006/12/05 更新:
经测试,在不同的机器上,内存的释放形式会有所差异。
因此,最保险的方法是把使用过的所有Excel相关的对象都用ReleaseComObject释放掉,最后调用System.GC.Collect(0)回收内存。例如:
excelWorkBook.Close()
appExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel)
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelWorkSheet)
System.Runtime.InteropServices.Marshal.ReleaseComObject (excelWorkBook)
excelWorkSheet = Nothing
excelWorkBook = Nothing
appExcel = Nothing
System.GC.Collect(0)
……