2011-08-30 16 views
6

जारी नहीं कर रहा है मैं विंडोज 7 गैजेट पर काम कर रहा हूं जिसे एक्सेल दस्तावेज़ से डेटा खींचने की आवश्यकता है। समस्या यह है कि, मुझे आवश्यक डेटा पुनर्प्राप्त करने के बाद एक्सेल प्रक्रिया अनलोड नहीं होगी।विंडोज 7 गैजेट ActiveX ऑब्जेक्ट

यहाँ कोड मैं अपने प्रारंभ समारोह में उपयोग करें:

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; 

यह सब एक कोशिश पकड़ ब्लॉक में लपेटा जाता है और मुझे लगता है कि यह सब सफल रहा है सत्यापित कर सकते हैं। सभी हटावट और शून्य असाइनमेंट COM ऑब्जेक्ट्स के किसी भी संदर्भ को रिलीज़ करने का मेरा प्रयास है, लेकिन मुझे कुछ याद आ रहा है। क्या कोई तरीका है कि मैं Excel प्रक्रिया को अनलोड करने के लिए मजबूर कर सकता हूं?

उत्तर

6

यह है कि कैसे इंटरनेट एक्सप्लोरर/जेस्क्रिप्ट काम करता है — संदर्भ कचरा कलेक्टर चलाने तक समय के लिए आयोजित किए जाते हैं। संदर्भ थोड़ी देर के बाद एकत्रित कचरा होना चाहिए यदि आप चर को null पर सेट करते हैं। तुम भी मजबूर कर सकते हैं यह (अपेक्षाकृत गैर-दस्तावेजी) CollectGarbage() विधि JScript और IE के लिए उपलब्ध का उपयोग करके एकत्र होने के लिए:

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

//... blah ... 

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

ध्यान दें कि आप (10ms यहाँ) CollectGarbage() कॉल करने से पहले समय की एक छोटी राशि छोड़ने की जरूरत है, अन्यथा जब आप फ़ंक्शन को कॉल करते हैं तो चर को संग्रह के लिए अभी तक चिह्नित नहीं किया गया हो सकता है।

संबंधित समर्थन लेख: http://support.microsoft.com/kb/266088

+0

नोट है कि मैं एक डेस्कटॉप गैजेट में अभी-अभी यह परीक्षण किया है और यह प्रक्रिया सूची से प्रक्रिया को दूर करता है इस बात की पुष्टि कर सकते हैं। –

+0

बहुत बढ़िया - खेद है कि मेरे पास परीक्षण करने के लिए कुछ समय लगेगा, लेकिन यह अब अपेक्षित काम करता है। – Eclipse

+0

@ ग्रहण: कोई समस्या नहीं :-) –

0

मेरे पास मेरी वर्तमान मशीन पर माइक्रोसॉफ़्ट ऑफिस स्थापित नहीं है, लेकिन मुझे विश्वास है कि आपको Excel.Quit()Excel.Application.Quit() में बदलना होगा।

ऐसा इसलिए है क्योंकि एक्सेल को ActiveX ऑब्जेक्ट के रूप में प्रारंभ किया गया है, विशेष रूप से Excel.Application, और Excel स्वयं ही नहीं।