【问题标题】:Saving and Closing an Excel File Created in C# .Net Using Excel Office Interop dll使用 Excel Office Interop dll 保存和关闭在 C# .Net 中创建的 Excel 文件
【发布时间】: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/…

标签: c# .net excel interop


【解决方案1】:

没有 100% 的方法可以在所有情况下始终从 .NET 中删除 COM 对象,但是在调用 Quit() 之后附加 Marshal.FinalReleaseComObject (application); application = null; 会增加您的机会...

有关 MSDN 参考,请参阅 http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.finalreleasecomobject.aspx

【讨论】:

  • 我试过了,但没有运气。到底值不值,我查看了FinalReleaseComObject方法的返回值,结果是0,应该是已经释放了,但是在任务管理器里我还是看到了Excel。
  • 那么剩下的唯一选择(不好的做法!)就是找到 Excel 的进程 ID 并杀死它...
猜你喜欢
  • 1970-01-01
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多