如何检测Excel工作簿是否已关闭(在C#中使用Interop)?
我正在研究使用Microsoft.Office.Interop.Excel.Application
从Excel文件读取值的C#项目:
try {
Application xlApp = new Application();
Workbook workbook = xlApp.Workbooks.Open(filename)
// ... Load Excel values ...
} finally {
// ... Tidy up ...
}
在finally
块中,我想确保所有内容都被关闭并妥善处理,所以没有任何东西在内存中挂起,并且Excel完全关闭。 已经看到了这个代码应该看起来像什么(比我想象的更复杂)的各种线程,但它可能包括的一件事是:
if (workbook != null) {
workbook.Close();
// ... possibly also Marshal.FinalReleaseComObject(workbook);
}
但是,如果工作簿已关闭,则会引发错误,那么如何安全地检查该问题? 如果可能的话,宁愿不要仅仅捕捉错误,因为这种类型的东西往往会扭曲调试。 在结束之前找到工作簿状态是否有一种干净的方式?
还有一个问题 - 我想知道是否需要workbook.Close()
,如果xlApp.Quit();
之后完成 - 会退出Excel应用程序导致workbook.Close()
(和任何COM对象释放)隐式发生?
在您打开工作簿时,最好的建议是跟踪工作簿并在适当的时候关闭工作簿。 如果您的代码非常详细,那么您可以存储一个Boolean
值,指示文件当前是打开还是关闭。
在Excel中没有属性,如IsOpen。 您可以尝试引用该工作簿:
Workbook wbTest = xlApp.Workbooks.get_Item("some.xlsx");
但是如果书没有打开,这会产生一个COM错误,所以会变得非常混乱。
相反,创建自己的函数IsOpen
返回一个布尔值,并循环通过当前打开的工作簿( Workbooks
集合)检查名称,使用如下代码:
foreach (_Workbook wb in xlApp.Workbooks)
{
Console.WriteLine(wb.Name);
}
如果工作簿已保存,则workbook.Close()
将不必要 - 反映了Excel的正常行为。 但是,所有Excel对象引用都需要发布。 正如你发现的那样,这有点烦琐,而Close
和Quit
自己并没有做到这一点。
static bool IsOpen(string book)
{
foreach (_Workbook wb in xlApp.Workbooks)
{
if (wb.Name.Contains(book))
{
return true;
}
}
return false;
}
链接地址: http://www.djcxy.com/p/35661.html
上一篇: How to detect whether an Excel workbook is closed (using Interop in C#)?