2011-03-18 19 views
1

我使用C#來讀/寫數據到Excel電子表格。戒菸擅長用C#(在使用Excel自動化)

我使用這三個語句來打開我的excel文件

Excel.Application excelapp = new Excel.Application(); 
Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet; 
Excel._Worksheet worksheet = (Excel._Worksheet)workbook.ActiveSheet; 

而這兩條線來關閉/保存圖紙。

workbook.Save(); 
    workbook.Close(); 

我遇到的問題是EXCEL過程仍處於活動狀態。 (我使用任務管理器進行檢查)。在讀取/寫入數據到工作表後,我有20個EXCEL進程處於活動狀態。

如果有人能告訴我結束excelapp PROC權後,我關閉工作簿,將是巨大的技術。

非常感謝,亞倫。

回答

4

直接讓

excelapp.Quit(); 

與Excel的所有工作之後。

如果進程仍然在運行,嘗試使用所有的Excel對象Marshal.ReleaseComObject和強制立即垃圾收集:

System.Runtime.InteropServices.Marshal.ReleaseComObject(excelapp); 
excelapp = null; 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

注意,你需要使用ReleaseComObject不僅與您excelapp對象,而且還與每工作簿和工作表,你曾經使用過。

+0

+1很好的答案。我也會在我的應用中使用它! – gideon 2011-03-19 06:18:51

4

Archer與ReleaseComObject在正確的軌道上,但是如果您需要弄亂垃圾收集,那麼您在自動化代碼中犯了一個錯誤。

最可能的原因是不是倒閉就是你有一些對象,你不能釋放,因爲你沒有把它存儲在一個變量孤兒引用。一個常見的原因是,如果您在一次調用中訪問多個「圖層」。

例如,如果你做這樣的事情:一個工作簿,工作表和一系列

Workbooks("Book1").Sheets("Sheet1").Range("A1:A2").Value = 1; 

那麼你將創建引用(?也許Sheets集合太大),其中沒有一個可以正確釋放。

因此,你必須把它了這樣的拆分爲數個步驟(從內存中,並從一個後期綁定點完全寫入,我可能已經否則錯過了一些東西,你需要釋放):

object wb = Workbooks("Book1"); 
object sheet = wb.Sheets("Sheet1"); 
object range = sheet.Range("A1:A2"); 
range.Value = 1; 

Marshal.ReleaseComObject(range); 
Marshal.ReleaseComObject(sheet); 
Marshal.ReleaseComObject(wb); 

在正常情況下,你不應該殺死進程或強制垃圾收集,唯一的時候,我還記得有這樣做的是,當我在我的代碼有錯誤。

+0

+1「,但如果您需要關於垃圾回收的問題,那麼您在自動化代碼中犯了一個錯誤」 – CJBS 2014-02-26 21:38:07