【发布时间】:2018-11-10 16:53:24
【问题描述】:
我正在做一个 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();
}
}
我看到了一些其他建议释放对象的帖子,以及对工作簿和工作表的引用。不确定,为什么这仍然不起作用。
【问题讨论】:
-
_worksheet是一个字段吗?这可能是造成它的原因。您可以尝试将其作为局部变量并将其传递给需要它的方法。 -
所以你标记了这个 excel,但这不是 excel 问题...
-
这不是一个 excel 问题@SolarMike? 我正在使用 Microsoft.Office.Interop.Library 创建一个新的 excel 文件,对其进行编辑并保存。
-
什么叫图书馆?用excel打开文件并运行宏?还是来自不同的程序?
-
@stuartd:好点。我会尝试不使用该字段。
标签: c# excel com office-interop