Microsoft Interop Excel关闭excel的运行实例?

嗨,大家好,我一直在阅读很多人发现很难关闭使用Com对象创建的正在运行的Excel应用程序的实例。 我设法零星地让Excel实例完全关闭,但不是所有的时间(我将在后面讨论)。


我的问题比简单地关闭正在运行的Excel实例要复杂得多,因为我正在尝试创建一个应用程序:

  • 使用许多可用模板之一创建一个Excel文件(这可以很好地工作)

  • 根据我的应用中选择的条件填充模板的单元格(也可以正常工作)

  • 允许用户继续输入无法从我的应用中的数据派生的值(这是关闭进程并删除co​​m对象更棘手的原因)

  • 在关闭Excel时保存数据(我可以在不清除com对象引用的情况下使用这个工作,但这显然意味着Excel进程没有被终止,试图清理com对象引用,但是它不会允许我保存工作表之后用户关闭excel,或者不管我如何实现它)。

  • 理想情况下,我想在用户关闭Excel时终止Excel过程。 (这是问题所在)


  • 至于com对象清理,我有一个清理方法,如下所示:

    private void cleanUp()
    {
        for (int i = 0; i < ranges.Count; i++)
        {
            ranges[i] = null;
        }
    
        for(int i = 0; i < worksheets.Count; i++)
        {
            worksheets[i] = null;
        }
    
        for (int i = 0; i < worksheetwrappers.Count; i++)
        {
            worksheetwrappers[i] = null;
        }
        for (int i = 0; i < workbooks.Count; i++)
        {
            while (System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks[i]) > 0)
                    {
                workbooks[i].Close(false, "", false);
                            workbooks[i] = null;
                    }
        }
        for (int i = 0; i < instances.Count; i++)
        {
                    while (System.Runtime.InteropServices.Marshal.ReleaseComObject(instances[i]) > 0)
                    {
                        instances[i].Quit();
                            instances[i] = null;
                    }
            }
    } 
    

    我还没有对此进行重构,并且使它很好而整齐,所以不幸的是你已经获得了我所拥有的基本知识。


    基本上我的问题是知道何时处理所有com对象以及何时执行清理,因为在电子表格填充后需要用户输入更多数据,这意味着我无法在电子表格填充后自动执行清理。

    我想知道是否我必须使用某种观察者来监听excel关闭时的情况,然后处理所有Com对象(这是一种痛苦),或者如果某人有一些我没有想到的聪明想法。

    谢谢你的帮助,

    尼克


    你可以尝试解决你的问题。

    1:根据模板创建工作表并填充数据

    2:使用参数“newfilename”启动进程Excel

    3:等待进程结束

    4:打开工作表,读取数据并处理对象

    也许这是一个选项 - 你至少知道用户什么时候结束了它的excel会话。

    链接地址: http://www.djcxy.com/p/6061.html

    上一篇: Microsoft Interop Excel closing running instances of excel?

    下一篇: How do I properly clean up Excel interop objects?