c# - 使用 Excel Office Interop dll 保存和关闭在 C# .Net 中创建的 Excel 文件

标签 c# .net excel interop

我很难找到有关如何使用 Exce 正确关闭和保存 Excel 文件的良好文档; Office Interop dll。

基本上,关于创建新的 Excel 工作簿和用列表中的数据填充第一个工作表的所有工作(当我将应用程序对象的可见属性设置为 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 对象,并且一切正常。

最佳答案

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

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

关于c# - 使用 Excel Office Interop dll 保存和关闭在 C# .Net 中创建的 Excel 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585276/

相关文章:

c# - 使用与结构相关的 ref 会导致它存储在堆上吗?

vba - 使用循环复制并粘贴到新行

c# - 查询 id 等于其他列的 id

c# - 需要使用 Moq 进行单元测试以获取特定代码的帮助

.net中Newtonsoft.Json.JsonConvert.SerializeObject(Object source,Newtonsoft.Json.JsonSerializerSettings())对应的java代码?

.net - 如何在自定义 FxCop 规则中检测自动实现的属性?

excel - 如果条件满足 VBA,则将数据从一个单元格复制到另一个单元格

Python 的 XlsxWriter 将文本框插入图表

c# - 如果未附加调试器,则捕获异常

c# - datetime.tostring 月日语言