2013-03-12 90 views
1

我試圖將一個工作表拷貝到另一個工作表中,下面是我的代碼..我嘗試發佈創建的excel實例,但仍然看到它在TaskManager中的一個實例。發佈excel實例創建

C#代碼:

try 
{ 
    wBook = xCel.Workbooks.Open(filePath); 
    xCel.Visible = false; 
    this.xCel.DisplayAlerts = false;     
    wBook = (Excel.Worksheet)wBook.Worksheets.get_Item(1); 
    wBook.Copy(Type.Missing, Type.Missing);     
    wBook = (Excel.Worksheet)wBook.Sheets[1];     
    wBook.SaveAs(strFileCopyPath);     
} 
finally 
{ 
    if (wBook != null) 
    { wBook.Close();      
     Thread.Sleep(500); 
    }     
    Marshal.ReleaseComObject(wBook);    
    Marshal.ReleaseComObject(wBook);     
} 

請一些人告訴自己做錯了什麼我真的在這裏做什麼? 謝謝

+0

請參閱[這裏](http://stackoverflow.com/q/13572004/976080)如何以及何時發佈對象,和[這裏](http://stackoverflow.com/q/13069153/) 976080)限制使用「兩個點」。當你調用'wBook.Worksheets.get_Item(1);'創建一箇中間的'工作表'對象時,但由於你沒有對它的引用,所以你不能釋放它。 – 2013-03-12 16:36:02

回答

0

你什麼都不做理智的錯誤 - 但收盤EXEL的概念是非常輕率的。 那是因爲: 1:Excel有時會創建中間對象,它們對您而言不可見,特別是如果您按如下所示進行操作:DIm bla = excel.worksheet.range(「A1」).value。然後有excel的中間對象。 2:excel對象必須以非常特定的順序關閉。

此代碼應幫助:

GC.Collect() 
GC.WaitForPendingFinalizers() 
GC.Collect() 
GC.WaitForPendingFinalizers() 

這必須是雙歸因於通過1只標誌着中間對象的事實,但不破壞它們。這是垃圾收集。

也會破壞你的對象順序爲: 範圍等 工作表 工作簿 APP

這樣的:

System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlSheet) 
xlsheet = nothing 
xlBook .Close() 
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlBook) 
xlbook = nothing 
xlapp.quit 
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(xlapp) 
xlapp = nothing 

使用嘗試捕捉捕捉錯誤在本節中,如果一個對象是沒有什麼..

0

忘記了方法Excel.Application對象。通常遊戲我使用下面的代碼以關閉Excel(VB.Net代碼片段):

xlApp.Quit() 
System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp) 
xlApp = Nothing 
xlBook = Nothing 
xlSheet = Nothing