【发布时间】:2011-09-28 15:02:22
【问题描述】:
我很难找到关于如何使用 Exce 正确关闭和保存 Excel 文件的好文档; Office 互操作 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 对象,并且一切正常。
【问题讨论】:
-
这对我来说是正确的,是什么让你怀疑你可能做得不对?
-
Excel 在代码执行后仍然显示在任务管理器中,只是想确保它不会留在那里并占用内存。
-
那么我认为您的问题不在于关闭 Excel,而在于处理其他一些 Excel 对象。查看这个 StackOverflow 问题,它可能会对您有所帮助。 stackoverflow.com/questions/158706/…