• 用完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加上诸如公式和折叠这样的功能啊?
  • 相关阅读:
    rac node1节点侦听地址为127.0.0.1问题
    rac crs节点故障(未解决)
    杂牌设备网络接入引起交换机引起端口翻转的故障
    Impdp导出前准备工作以及主要命令
    查询dba_tables视图tablespaces_name为空的问题
    Expdp导出前准备工作以及主要命令
    带参数的方法解析
    类的无参方法,注释
    类和对象的解析
    二重循环的解析
  • 原文地址:https://www.cnblogs.com/index/p/298235.html
Copyright © 2020-2023  润新知