2011-08-30 35 views
6

Tôi đang làm việc trên tiện ích Windows 7 cần kéo dữ liệu từ tài liệu excel. Vấn đề là, là quá trình Excel sẽ không dỡ bỏ sau khi tôi đã lấy dữ liệu tôi cần.Tiện ích Windows 7 không giải phóng đối tượng ActiveX

Dưới đây là đoạn code tôi sử dụng trong chức năng khởi tạo của tôi:

var Excel = new ActiveXObject("Excel.Application"); 
    Excel.Visible = false; 
    Excel.DisplayAlerts = false; 
    var workbooks = Excel.Workbooks; 
    var workbook = workbooks.Open("\\\\SERVER\\Documents\\Sample.xlsx", 0, true); 
    var activesheet = workbook.ActiveSheet; 
    var cell = sheet.Cells(1, 1); 
    var value = cell.Value; 
    document.getElementById("content").innerHTML = value; 
    delete value; 
    value = null; 
    delete cell; 
    cell = null; 
    delete activesheet; 
    activesheet = null; 
    delete workbook; 
    workbook = null; 
    delete workbooks; 
    workbooks = null; 
    Excel.Quit(); 
    delete Excel; 
    Excel = null; 

này là tất cả được bọc trong một khối try-catch và tôi có thể xác minh rằng nó là tất cả thành công. Tất cả các xóa và bài tập null là nỗ lực của tôi để phát hành bất kỳ tài liệu tham khảo cho các đối tượng COM, nhưng tôi dường như thiếu một cái gì đó. Có cách nào tôi có thể buộc quá trình Excel để dỡ bỏ?

Trả lời

6

Đây chỉ là cách Internet Explorer/JScript hoạt động — tài liệu tham khảo được giữ trong một khoảng thời gian cho đến khi bộ thu gom rác chạy. Tham chiếu nên là rác được thu thập sau một thời gian nếu bạn đặt biến thành null. Bạn cũng có thể buộc nó được thu thập bằng (tương đối không có giấy tờ) CollectGarbage() phương pháp có sẵn để JScript và IE:

var Excel = new ActiveXObject("Excel.Application"); 

//... blah ... 

Excel.Quit(); 
Excel = null; 
window.setTimeout(CollectGarbage, 10); 

Lưu ý rằng bạn cần phải rời khỏi một lượng nhỏ thời gian (10ms đây) trước khi gọi CollectGarbage(), nếu không khi bạn gọi hàm, biến có thể chưa được đánh dấu để thu thập.

bài viết hỗ trợ liên quan: http://support.microsoft.com/kb/266088

+0

Lưu ý rằng tôi đã thử nghiệm này chỉ là bây giờ trong một tiện ích máy tính để bàn và có thể khẳng định nó không loại bỏ quá trình này từ danh sách trình. –

+0

Tuyệt vời - xin lỗi vì đã mất một thời gian để tôi thử nghiệm, nhưng nó hoạt động như mong đợi. – Eclipse

+0

@Eclipse: không có vấn đề gì cả :-) –

0

Tôi chưa cài đặt Microsoft Office trên máy hiện tại của mình, nhưng tôi tin rằng bạn phải thay đổi Excel.Quit() thành Excel.Application.Quit().

Điều này là do Excel được khởi tạo dưới dạng đối tượng ActiveX, cụ thể là Excel.Application và không phải là Excel.

Các vấn đề liên quan