Microsoft Interop Excelclosuresexcel的运行实例?

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


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

  1. 使用许多可用模板之一创build一个Excel文件(这工作正常)

  2. 根据在我的应用程序中select的标准填充模板的单元格(也工作正常)

  3. 允许用户继续input不能从我的应用程序中的数据派生的值(这是closures进程和删除com对象更棘手的原因)

  4. closuresExcel时保存数据(我可以得到这个工作,而不清理COM对象引用,但这显然意味着Excel进程没有被终止,试图清理COM对象引用,但它不会允许我保存工作表之后用户closuresexcel,或者不pipe我如何实现它)。

  5. 理想情况下,我想在用户closuresExcel时终止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; } } } 

我还没有重构这个,使它很好,很整洁,所以不幸的是你得到了我的atm的基本知识。


基本上我的问题是知道什么时候处理所有的COM对象,什么时候执行清理,因为在电子表格填充之后用户需要input更多的数据,这意味着我不能在电子表格填充之后自动执行清理。

我想知道如果我不得不使用某种观察者来监听excelclosures,然后处理所有Com对象(这是一个痛苦),或者如果有人有一些我没有想到的聪明的想法。

谢谢你的帮助,

尼克

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

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

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

3:等待进程结束

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

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