嘿大家,我一直在阅读很多人发现很难关闭使用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;
}
}
}
我还没有对此进行重构,并使其变得整洁,所以不幸的是你得到了我所拥有的基础知识。
基本上我的问题是知道何时处理所有com对象以及何时执行清理,因为用户需要在填充电子表格后输入更多数据,这意味着我无法在电子表格之后自动执行清理已经填充。
我想知道我是否必须使用某种观察者来监听excel关闭然后处理所有Com对象(这是一种痛苦)或者如果有人有一些聪明的想法我没想过的。
感谢您的帮助,
尼克
答案 0 :(得分:1)
您可以尝试解决您的问题。
1:根据模板创建工作表并填充数据
2:使用参数“newfilename”
开始处理Excel3:等待进程结束
4:打开工作表,读取数据并处理对象
也许这是一个选项 - 你至少知道用户何时结束了excel会话。