c# - 挥之不去的Excel流程
问题描述
我正在做一个 Windows 服务,我正在使用 Microsoft.Office.Interop.Excel 创建一个新的 excel 文件,对其进行编辑并保存。
完成后,关闭相应的对象(工作表,工作簿),退出 excel 应用程序,Marshal 释放 COM 对象,该过程仍然挥之不去。
private void doWork()
{
var excelApp = new MsExcel.Application();
var workBooks = excelApp.Workbooks;
var workbook = excelApp.Workbooks.Add();
var sheets = workbook.Sheets;
_worksheet = workbook.Sheets[1];
//Do Work Here
_worksheet.SaveAs(filePath);
workbook.Close(false,System.Reflection.Missing.Value,System.Reflection.Missing.Value);
workBooks.Close();
releaseObject(_worksheet);
releaseObject(sheets);
releaseObject(workbook);
releaseObject(workBooks);
excelApp.Quit();
releaseObject(excelApp);
}
private void releaseObject(object obj)
{
try
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
obj = null;
}
catch (Exception ex)
{
_log.Error($"Unable to release object {obj} Error:" + ex.ToString());
obj = null;
}
finally
{
GC.Collect();
}
}
我看到了其他一些建议释放对象的帖子,以及对工作簿和工作表的引用。不确定,为什么这仍然不起作用。
解决方案
Microsoft 目前不推荐也不支持任何无人值守、非交互式客户端应用程序或组件(包括 ASP、ASP.NET、DCOM 和 NT 服务)的 Microsoft Office 应用程序自动化,因为 Office 可能表现出不稳定的行为和/或在此环境中运行 Office 时出现死锁。
如果您正在构建在服务器端上下文中运行的解决方案,您应该尝试使用已确保无人值守执行安全的组件。或者,您应该尝试找到允许至少部分代码在客户端运行的替代方案。如果您使用来自服务器端解决方案的 Office 应用程序,该应用程序将缺少许多成功运行所需的功能。此外,您将承担整体解决方案稳定性的风险。在Office 服务器端自动化的注意事项文章中阅读有关此内容的更多信息。
作为一种解决方法,您可以考虑使用One XML SDK或任何其他为服务器端或服务执行而设计的第三方组件。