如何检测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对象引用都需要发布。 正如你发现的那样,这有点烦琐,而CloseQuit自己并没有做到这一点。


    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#)?

下一篇: Excel process still runs after closing in VB.net