我很难找到关于如何使用Exce正确关闭和保存Excel文件的良好文档; Office Interop dll。
基本上,我在创建新的Excel工作簿和使用列表中的数据填充第一个工作表方面做了一切工作(当我在应用程序对象上将visible属性设置为true时,我可以看到Excel文件打开并填充工作表正是我想要的方式。)
我只需要知道如何正确关闭Excel文件并将其保存到我选择的位置。我想确保在代码完成时完全杀掉Excel - 不要让它在我完成时继续保留内存。
现在,在使用我想要的数据填充工作表之后,我正在执行以下操作:
workbook.Save();
workbook.Close(Type.Missing, Type.Missing, Type.Missing);
application.Quit();
更新:我现在可以将Excel文件保存到我想要的位置。我只是删除了Save()调用并将Close调用更改为(true,filePath,Type.Missing),现在它将文件放在所需的位置。
只有要解决的问题是正确关闭COM对象。
可能的解决方案每次代码完成执行时,至少这似乎会从任务管理器中删除Excel。
// Close the workbook, tell it to save and give the path.
workbook.Close(true, workbookPath, Type.Missing);
// Now quit the application.
application.Quit();
// Call the garbage collector to collect and wait for finalizers to finish.
GC.Collect();
GC.WaitForPendingFinalizers();
// Release the COM objects that have been instantiated.
Marshal.FinalReleaseComObject(workbook);
Marshal.FinalReleaseComObject(worksheet);
Marshal.FinalReleaseComObject(workrange);
Marshal.FinalReleaseComObject(application);
我相信这会奏效。我认为问题在于我没有发布已经实例化的所有内容,而且我认为迫使GC收集是最后遗漏的部分。我运行了20次,每次任务管理器显示Excel,然后在代码完成后将其删除。
最终更新:上面的代码肯定是处理掉所有COM对象,一切正常。
答案 0 :(得分:1)
没有100%的方法总是在所有的情况下摆脱.NET中的COM对象,但在调用Marshal.FinalReleaseComObject (application); application = null;
之后附加Quit()
会增加你的机会......
有关MSDN参考,请参阅http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.finalreleasecomobject.aspx