现在流传最多的关闭Excel进程的代码就是下面这几行了.
1
System.Runtime.InteropServices.Marshal.ReleaseComObject(r);
2
System.Runtime.InteropServices.Marshal.ReleaseComObject(myBook);
3
System.Runtime.InteropServices.Marshal.ReleaseComObject(myExcel);
4
5
GC.Collect();
以前经常做Winform下面的Excel开发, 也是一直这样写程序的, 倒也相安无事
现在碰到了需要在Webform下做Excel, 而且巨恐怖的Excel格式, 要求程序里加上格式, 公式, 折叠, 注释等等.
WebForm下用这段代码始终就关闭不了. 始终有一个Excel的进程存在.
后来才发现, 把对Excel的操作代码单独成一个方法, 然后在这个方法调用完毕以后再执行GC.Collect()即可
把以上的操作放入一个CreateExcel的方法中去, 调用代码
1
ExcelBusiness.BSExcel.CreateExcel(filePath);
2
GC.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加上诸如公式和折叠这样的功能啊?