2013-02-22 138 views
1

我開發了這個腳本,我在xls工作表上編寫。ActiveXObject - Excel.Application不釋放資源

var excelFile = "C:\\TestActiveX\\Test.xls"; 
function readExcelFileAndUpdateView() 
{ 
    var w =new ActiveXObject("Excel.Application");  
    w.Workbooks.Open(excelFile); 
    var objWorksheet1 = w.Worksheets(1);  
    var name =objWorksheet1.Cells(1,2); 
    if(name==null){ 
     name=""; 
    } 

    var objWorksheet2 = w.Worksheets(2);  
    var surname = objWorksheet2.Cells(1,2); 
    if(surname==null){ 
     surname=""; 
    } 

    var str = "Name is :"+name+"<br/>Surname is :"+surname; 

    document.getElementById("txtAreaXLS").innerHTML=str;  
    w.Application.Quit(); 
    w.Quit(); 
    w = null;    
} 

的問題是,當這個函數執行結束後,我在我的Windows任務管理器運行2個EXCELL對象。在我的功能結束時釋放資源似乎不起作用。

我也試過objWorksheet1.close(true);w.Workbooks.Close(true);w.ActiveWorkbook.Close(true);沒有運氣。

有沒有人有線索是開放的對象,我怎麼能擺脫它們?

+0

雖然你已經設置W = NULL,你還是要objWorksheet1,姓名,objWorksheet2,姓引用。你有沒有嘗試將它們設置爲null,所以你對任何excel對象都有零引用? – tgolisch 2013-02-22 15:00:26

+0

如果我將引用設置爲null,那麼對象仍然存在於內存中。 'objWorksheet1 = null; objWorksheet2 = null;' – MaVRoSCy 2013-02-22 15:08:02

+0

ActiveX跟蹤所有對自身的引用,並且只會在引用計數變爲零時從內存中釋放它自己。 – tgolisch 2013-02-22 15:25:10

回答

1

ActiveX可以有一些奇怪的行爲。您需要確保將所有對ActiveX對象(和子對象/成員)的引用設置爲空。在你的代碼中,你已經設置了w = null,但是你仍然有對objWorksheet1,name,objWorksheet2,surname的引用。將它們也設置爲null。我會推薦一個try/catch/finally塊,你可以在finally塊中清空它們。

在CodeProject上有一篇很好的文章推薦:保存,關閉,退出,空。儘管如此,除非您已經禁止所有對其成員的ActiveX對象&的引用,否則這並不重要。

第12節和第13有一些很好的例子: http://www.codeproject.com/Articles/404688/Word-Excel-ActiveX-Controls-in-ASP-NET