2011-09-28 79 views
4

我很難找到關於如何使用Exce正確關閉和保存Excel文件的良好文檔; Office Interop dll。保存並關閉在C#.Net中創建的Excel文件使用Excel Office Interop dll

基本上,我所有的工作都是關於創建一個新的Excel工作簿,並用列表中的數據填充第一個工作表(當我在應用程序對象上將visible屬性設置爲true時,我可以看到Excel文件打開並填充該工作表正是我想要的方式。)

我只需要知道如何正確關閉Excel文件並將其保存到我選擇的位置。我想確保在代碼完成後我徹底殺死了Excel - 當我完成時不希望它繼續保留內存。

現在我用數據填充工作表後做下面我想:

workbook.Save(); 
workbook.Close(Type.Missing, Type.Missing, Type.Missing); 
application.Quit(); 

更新:我現在能夠以Excel文件保存到我想要的位置。我只是刪除了Save()調用並將Close調用改爲(true,filePath,Type.Missing),現在它將文件放在所需的位置。

唯一需要解決的問題是正確關閉COM對象。

可能的解決方案至少這似乎每次代碼完成執行時從任務管理器中刪除Excel。

// Close the workbook, tell it to save and give the path. 
workbook.Close(true, workbookPath, Type.Missing); 

// Now quit the application. 
application.Quit(); 

// Call the garbage collector to collect and wait for finalizers to finish. 
GC.Collect(); 
GC.WaitForPendingFinalizers(); 

// Release the COM objects that have been instantiated. 
Marshal.FinalReleaseComObject(workbook); 
Marshal.FinalReleaseComObject(worksheet); 
Marshal.FinalReleaseComObject(workrange); 
Marshal.FinalReleaseComObject(application); 

我相信這會起作用。我認爲問題在於我沒有釋放所有已經實例化的東西,我認爲迫使GC收集是最後缺失的一部分。我跑了20次,每次任務管理器都會顯示Excel,然後在代碼完成後將其刪除。

最終更新:上面的代碼肯定會處理所有的COM對象,並且一切正常。

+0

這看起來對我來說是正確的,是什麼讓你懷疑你可能做得不對? – Mathias

+0

在代碼執行後,Excel仍會在任務管理器中顯示,只是想確保它不會留在那裏並佔用內存。 –

+0

然後我認爲你的問題不是關閉Excel,而是配置其他一些Excel對象。看看這個可能會幫助你的StackOverflow問題。 http://stackoverflow.com/questions/158706/how-to-properly-clean-up-excel-interop-objects-in-c – Mathias

回答

1

沒有100%的方法來始終都cicumstances下襬脫從.NET COM對象,但調用Quit()後追加Marshal.FinalReleaseComObject (application); application = null;增加你的機會......

對於參考MSDN看http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.finalreleasecomobject.aspx

+0

我試過,沒有運氣。對於它的價值,我檢查了FinalReleaseComObject方法的返回值,它是0,這意味着它已經被釋放,但我仍然在任務管理器中看到Excel。 –

+0

然後唯一剩下的選擇(壞習慣!)是找到Excel的進程ID並殺死它... – Yahia

相關問題