2013-07-29 59 views
4

我對使用Microsoft.Office.Interop.Excel.Application從Excel文件中讀取值的C#項目的工作:如何檢測Excel工作簿是否已關閉(在C#中使用Interop)?

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); 
} 

但是,這將引發一個錯誤,如果工作簿已經被關閉,所以我怎麼能安全地檢查這個?如果可能的話,寧願不要僅僅捕捉錯誤,因爲這種類型的東西往往會扭曲調試。在結束之前找到工作簿狀態是否有一種乾淨的方式?

還有一個q-am想知道是否需要workbook.Close()如果xlApp.Quit();事後完成 - 會退出Excel應用程序導致workbook.Close()(和任何COM對象釋放)隱式發生?

回答

2

當您打開工作簿時,最好的建議是跟蹤工作簿並在適當時關閉它。如果您的代碼非常詳細,那麼您可以存儲一個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; 
    } 
+0

很好地回答了這兩個Q的 - 謝謝! –

相關問題