2010-07-13 57 views
1

嘿大家好,我一直在閱讀很多關於使用Com對象創建的正在運行的excel應用程序的實例的難題。我設法零星地讓Excel實例完全關閉,但不是所有的時間(我將在後面討論)。Microsoft Interop Excel關閉excel的運行實例?


我的問題是相當複雜得多,只需關閉Excel的運行實例作爲我試圖創建一個應用程序,將:

  1. 創建一個使用多種可用的模板之一的Excel文件(這工作正常)

  2. 填充模板取決於我的應用程序選擇的標準(也能正常工作的細胞)

  3. 允許用戶繼續輸入不能從我的應用程序中的數據派生的值(這是什麼使關閉進程和刪除COM對象更棘手)

  4. 關閉Excel時保存數據(我可以在不清理COM對象引用,但這顯然意味着Excel進程沒有被終止,試圖清理com對象引用,但它不會允許我保存工作表後,用戶關閉excel,或不是我如何實現它)。

  5. 理想情況下,我想在用戶關閉Excel時終止Excel過程。 (這裏的問題所在)


對於COM對象的清理,我有一個清理方法如如下:

private void cleanUp() 
{ 
    for (int i = 0; i < ranges.Count; i++) 
    { 
     ranges[i] = null; 
    } 

    for(int i = 0; i < worksheets.Count; i++) 
    { 
     worksheets[i] = null; 
    } 

    for (int i = 0; i < worksheetwrappers.Count; i++) 
    { 
     worksheetwrappers[i] = null; 
    } 
    for (int i = 0; i < workbooks.Count; i++) 
    { 
     while (System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks[i]) > 0) 
       { 
      workbooks[i].Close(false, "", false); 
         workbooks[i] = null; 
       } 
    } 
    for (int i = 0; i < instances.Count; i++) 
    { 
       while (System.Runtime.InteropServices.Marshal.ReleaseComObject(instances[i]) > 0) 
       { 
        instances[i].Quit(); 
         instances[i] = null; 
       } 
     } 
} 

我還沒有重構這一點,並使它不錯,整潔,所以不幸的是,你得到了我所擁有的基本知識。


基本上我的問題是要知道何時處置所有的COM對象,當作爲要求用戶電子表格已被填充後,進入更多的數據進行清理,這意味着我不能自動執行清理在電子表格填充之後。

我想知道如果我不得不使用某種觀察者來監聽什麼時候excel關閉,然後處理所有Com對象(這是一種痛苦),或者如果有人有一些聰明的想法我沒有想到。

感謝您的幫助,

尼克

回答

1

你可以嘗試解決您的問題。

1:創建基於模板的工作表和填充數據

2:等待進程結束

4:4:與參數 「newfilename」

3啓動過程的Excel打開工作表,讀數據和處理對象

也許這是一個選項 - 你至少知道用戶什麼時候結束了它的excel會話。

+0

你的傳奇,結合使用不同的清理方法:D! – user389981 2010-07-13 22:53:17

+0

@riffnl你能否請你包括你的代碼,這對我來說已經是超級挫敗了 – 2012-04-02 18:40:14

+0

@l___我沒有代碼。我實際上沒有爲此做出解決方案。原來的問題實際上是:「我想知道用戶何時完成了我的Excel會話」。這就是我所建議的,使用該進程並等待它結束(請參閱:http://support.microsoft.com/kb/305369)。 – riffnl 2012-04-03 08:10:21