Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Microsoft Interop Excel是否关闭正在运行的Excel实例?_C#_Excel_Interop - Fatal编程技术网

C# Microsoft Interop Excel是否关闭正在运行的Excel实例?

C# Microsoft Interop Excel是否关闭正在运行的Excel实例?,c#,excel,interop,C#,Excel,Interop,大家好,我已经读到很多人发现很难关闭使用Com对象创建的正在运行的excel应用程序的实例。我偶尔设法使Excel实例完全关闭,但并非总是如此(稍后我将讨论这个问题) 我的问题比简单地关闭正在运行的Excel实例要复杂得多,因为我正在尝试创建一个应用程序,该应用程序将: 使用许多可用模板中的一个创建Excel文件(这很好) 根据在我的应用程序中选择的条件填充模板的单元格(也可以正常工作) 允许用户继续输入无法从我的应用程序中的数据中派生的值(以下是使关闭进程和删除com对象更加棘手的原因) 关

大家好,我已经读到很多人发现很难关闭使用Com对象创建的正在运行的excel应用程序的实例。我偶尔设法使Excel实例完全关闭,但并非总是如此(稍后我将讨论这个问题)


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

  • 使用许多可用模板中的一个创建Excel文件(这很好)

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

  • 允许用户继续输入无法从我的应用程序中的数据中派生的值(以下是使关闭进程和删除com对象更加棘手的原因)

  • 关闭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;
                    }
            }
    } 
    
    private void cleanUp()
    {
    对于(int i=0;i0)
    {
    工作簿[i]。关闭(假,“,假);
    工作簿[i]=空;
    }
    }
    for(int i=0;i0)
    {
    实例[i].Quit();
    实例[i]=null;
    }
    }
    } 
    
    我还没有对它进行重构,使其美观整洁,所以不幸的是,您已经掌握了我的基本知识


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

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

    谢谢你的帮助


    Nic

    您可以尝试解决您的问题

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

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

    3:等待进程结束

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


    也许这是一个选项—您至少可以知道用户何时结束excel会话。

    您可以尝试解决您的问题

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

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

    3:等待进程结束

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


    也许这是一个选项-您至少可以知道用户何时结束excel会话。

    您的图例与使用不同的清理方法结合使用:D@riffnl你能把你的代码写进去吗?这已经是非常令人沮丧的一段时间了me@l___我没有这方面的代码。我并没有为这个问题找到解决办法。最初的问题实际上是:“我想知道用户何时完成我的Excel会话”。这就是我建议的,使用该过程并等待它结束(请参见:)。您可以使用不同的清理方法:D@riffnl你能把你的代码写进去吗?这已经是非常令人沮丧的一段时间了me@l___我没有这方面的代码。我并没有为这个问题找到解决办法。最初的问题实际上是:“我想知道用户何时完成我的Excel会话”。这就是我的建议,使用这个过程并等待它结束(请参阅:)。