为了明天

时光匆匆流逝, 笑看风起云落 - 流浪的狗2012

导航

用完Excel组件后 如何彻底关闭Excel进程

现在流传最多的关闭Excel进程的代码就是下面这几行了.

1System.Runtime.InteropServices.Marshal.ReleaseComObject(r);
2
System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
3
System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
4

5GC.Collect();

以前经常做Winform下面的Excel开发, 也是一直这样写程序的, 倒也相安无事

现在碰到了需要在Webform下做Excel, 而且巨恐怖的Excel格式, 要求程序里加上格式, 公式, 折叠, 注释等等.
WebForm下用这段代码始终就关闭不了. 始终有一个Excel的进程存在.
后来才发现, 把对Excel的操作代码单独成一个方法, 然后在这个方法调用完毕以后再执行GC.Collect()即可

把以上的操作放入一个CreateExcel的方法中去, 调用代码

1ExcelBusiness.BSExcel.CreateExcel(filePath);
2GC.Collect();

这样写的话, 就可以在每次执行完毕以后就马上关闭这个Excel进程了

关于GC.Collect()这个方法, 放在调用Excel的方法中执行, 但是这个时候方法还并没有执行完毕, 所以无法判断当前使用的Excel是不是无用的. 所以无法关闭当前这个Excel的进程. 有时候我也看到这样写系统中始终会存在一个Excel进程, 也就是因为这个原因, 每次执行到这里的时候, 因为上次的Excel进程已经没有用了, 所以就把上次Excel进程关闭掉了, 但是本次的Excel进程始终存在. 如果把GC.Collect()这个方法写在调用Excel的方法外面, 就可以正确关闭了.

MSDN中关于这个方法的说明

GC.Collect 方法 ()  [C#]

强制对所有代进行垃圾回收。

[C#]
public static void Collect();

备注
使用此方法尝试回收所有无法访问的内存。然而,Collect 方法并不保证可以回收所有无法访问的内存。

无论对象在内存中的时间有多长,所有的对象均被考虑回收;不过,在托管代码中引用的对象不会被回收。使用此方法强制系统尝试回收最大可用内存量。

另外, 请各位对Excel有过深入研究的大侠指教一下.
如果在程序里给一个Excel加上诸如公式和折叠这样的功能啊?

posted on 2005-12-16 09:25  流浪的狗  阅读(19737)  评论(16编辑  收藏  举报