我假设Excel会死于Monkey:
,我编写了以下代码class ExcelMonkey
{
private static Excel.Application xl = new Excel.Application();
public static bool parse(string filename)
{
if (filename.Contains("foo"))
{
var workbook = xl.Workbooks.Open(filename);
var sheet = workbook.Worksheets.get_Item(1);
// do stuff
return true;
}
return false;
}
}
我如何确定它呢?我是否需要单独发布workbook
和sheet
?
我希望在程序的生命周期内安装Excel,这是一项巨大的性能提升。
答案 0 :(得分:2)
我是否需要单独发布工作簿和工作表?
是的,要么将基础Excel应用程序对象保持活动状态。
我如何确定它呢?
Marshal.ReleaseComObject
会这样做,但请确保在此之后不要使用对象的引用。
答案 1 :(得分:1)
以下是工作解决方案,以防任何人感兴趣:
class ExcelMonkey
{
private Excel.Application xl = new Excel.Application();
~ExcelMonkey()
{
xl.Quit();
Dispose(false);
}
private bool isDisposed = false;
protected void Dispose(bool disposing)
{
Marshal.ReleaseComObject(xl);
isDisposed = true;
}
public bool parse(string filename)
{
if (filename.Contains("foo"))
{
var workbook = xl.Workbooks.Open(filename);
var sheet = workbook.Worksheets.get_Item(1);
try
{
// do stuff
}
finally
{
Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(workbook);
}
return true;
}
return false;
}
}
答案 2 :(得分:1)
作为一些背景知识,Excel倾向于在幕后生成隐藏引用,作为用于支持VBA的COM默认机制的函数。例如,您可以与“应用程序”交谈,它会安静地设置一个您无法分离的COM引用。
在编写Excel时,您仍然需要对COM引用非常细致。
事实上,PIA也喜欢在幕后生成引用,并且在收集垃圾时不能正确整理这些引用。您必须显式关闭任何COM引用。
答案 3 :(得分:1)
如果您想使用office文件,我建议您查看NPOI lib。这是一个用于java的POI lib的点网端口,它在使用office文件时可以工作。不需要凌乱的COM,所有都在CLR代码中完成,一切都按预期工作。
我用它来生成excel报告没有问题。试一试,我相信你不会后悔的。比使用COM
好多了答案 4 :(得分:0)
xl.Quit();