2009-01-12 9 views
7

में एक्सेल घटनाओं अप करने के लिए हुक कर सकते हैं एक क्लाइंट-साइड वेब अनुप्रयोग में, मैं करना चाहते हैं:मैं कैसे जावास्क्रिप्ट

  1. Excel स्प्रेडशीट खोलने एक्सेल में
  2. निर्यात कुछ एप्लिकेशन डेटा,,
  3. उपयोगकर्ता को इसके साथ काम करने की अनुमति दें, और
  4. जब वे पूरा हो जाएं, तो मेरे आवेदन में वापस (संभावित रूप से परिवर्तित) डेटा पढ़ें।

मैं उपयोगकर्ता चाहते एक तरल पदार्थ अनुभव है और पता लगाने के लिए जब वे BeforeClose ईवेंट के लिए ऊपर hooking द्वारा एक्सेल के साथ किया जाता है करने के लिए होगा, लेकिन मुझे लगता है कि मैं जावास्क्रिप्ट/HTML में एक्सेल की घटनाओं के लिए ऊपर हुक करने में असमर्थ हूँ।

function BeforeCloseEventHandler(cancel) { 
    // TODO: read values from spreadsheet 
    alert("Closing..."); 
} 

function openExcel() { 
    var excel = new ActiveXObject("Excel.Application"); 
    var workbook = excel.Workbooks.Add(); 
    var worksheet = workbook.Worksheets(1); 
    worksheet.Cells(1, 1).Value = "First Cell"; 
    worksheet.Cells(1, 2).Value = "Second Cell"; 
    workbook.BeforeClose = BeforeCloseEventHandler; // THIS DOESN'T WORK 
    excel.Visible = true; 
    excel.UserControl = true; 
} 

क्या किसी के पास कोई सुझाव है?

+0

पहले तो मैंने सोचा कि आप पागल हो गए हैं ... अब मैं जवाब के लिए इंतजार नहीं कर सकता। –

उत्तर

-1

मुझे विश्वास नहीं है कि यह संभव है। कारण यह है कि, जब आप निम्न कोड को कॉल करते हैं:

आप वास्तव में एक्सेल खोल रहे हैं। तो निम्न पंक्ति के साथ:

workbook.BeforeClose = BeforeCloseEventHandler; 

ऐसा लगता है कि आप एक्सेल एप्लिकेशन को जावास्क्रिप्ट चलाने के लिए कह रहे हैं, जो संभव नहीं है। मैंने विकल्पों का शोध करने की कोशिश की है, जैसे कि इवेंट ऑब्जेक्ट बनाना, इसके पीछे कोड को परिभाषित करना, फिर इसे वर्कबुक पर असाइन करना। पहले बंद करें, लेकिन मैं एक ही समस्या में भागूंगा: एक्सेल ईवेंट जावास्क्रिप्ट द्वारा नहीं पहचाना जा सकता है। मुख्य रूप से क्योंकि यह एक अलग प्रक्रिया के रूप में चलाता है।

तो यहाँ कुछ और विकल्प है कि आप विचार कर सकते हैं:

  1. सहेजें उपयोगकर्ता के कंप्यूटर पर एक्सेल डेटा है, तो उपयोगकर्ता को खो देता है जब एक्सेल, उन्हें कहीं पर क्लिक करें कि आपके 1 विधि है, जो पढ़ता कॉल है कि फाइल और इसे प्रदर्शित करता है
  2. एक्सेल फ़ाइल से डेटा पढ़ें और फिर इसे प्रदर्शित करें।
  3. अपने एक्सेल ऑब्जेक्ट को बंद न करें (यह शायद आपके कंप्यूटर पर एक प्रक्रिया के रूप में एक्सेल खोल देगा), और जावास्क्रिप्ट में टाइमर ईवेंट होगा। प्रत्येक 5 सेकंड, जांचें कि क्या Excel अभी भी खुला है, और यदि यह खुला नहीं है, तो फ़ाइल पढ़ें और इसे प्रदर्शित करें।

क्षमा करें, मैं अब और मदद नहीं कर सका, और मुझे यकीन नहीं है कि इनमें से कोई भी विकल्प काम करेगा, लेकिन शुभकामनाएँ!

+1

मेरे पास जावास्क्रिप्ट के बारे में कोई सुराग नहीं है, इसलिए मेरे पास आपको संदेह करने का कोई कारण नहीं है - और जावास्क्रिप्ट के माध्यम से एक्सेल को हुक करना निश्चित रूप से "ध्वनि" असंभव है! हालांकि, प्रक्रिया से बाहर होना एक समस्या नहीं होनी चाहिए। वीबी 6, वीबी.नेट या सी # का उपयोग कर मानक आउट-ऑफ-प्रोसेस ऑटोमेशन का उपयोग करके आप पूरी तरह एक्सेल ईवेंट को हुक कर सकते हैं। –

+0

उदाहरण के तौर पर, http://support.microsoft.com/kb/823981 पर "दृश्य सी # .NET का उपयोग कर Excel के लिए ईवेंट कैसे प्रबंधित करें" देखें। लेकिन मुझे अभी भी जावास्क्रिप्ट के माध्यम से ऐसा करने का कोई संकेत नहीं है, और न ही मुझे यह पता चल सकता है कि यह किया जा सकता है ... –

1

कुछ शोध करने के बाद, मैंने पाया है कि मैं जावास्क्रिप्ट में गतिशील ActiveX ऑब्जेक्ट्स (यानी, new ActiveXObject कन्स्ट्रक्टर द्वारा बनाए गए हैं) पर ईवेंट को हुक नहीं कर सकता।

एक विचार यह है कि मैं एक रैपर विंडोज फॉर्म उपयोगकर्ता नियंत्रण बनाता हूं जिसे वेब एप में <object> टैग के अंदर होस्ट किया जाएगा। उपयोगकर्ता नियंत्रण Excel को कॉल करेगा और ईवेंट प्राप्त करेगा, और घटनाओं को जावास्क्रिप्ट पर वापस बढ़ाएगा, जिसे मैं <script for="..." event="..."> तंत्र का उपयोग करने के लिए तैयार कर सकता हूं। सुनिश्चित नहीं है कि यह काम करेगा, लेकिन मैं इसे आजमाउंगा।

भले ही यह काम करता है, मैं इस समाधान के बारे में विशेष रूप से खुश नहीं हूं।बहुत सारी परतें हैं - जावास्क्रिप्ट को चांदी के नियंत्रण से बुलाया जा रहा है जिसका अर्थ है कि मेरे डेटा को 3 सीमाओं को पार करना है और पीछे: सिल्वरलाइट -> जावास्क्रिप्ट -> होस्टेड विनफॉर्म उपयोगकर्ता नियंत्रण -> एक्सेल

इन सीमाओं में से कुछ को खत्म करना अच्छा होगा।

+0

क्या यह वेब ऐप इंट्रानेट है, जो कॉर्पोरेट क्लाइंट द्वारा उपयोग किया जाता है जिसे एक्सेल स्थापित करने की गारंटी दी जा सकती है? यदि नहीं, तो आपको या तो आपके कोड में क्रैश हो जाएगा, या यदि आप त्रुटियों को सही तरीके से संभालते हैं, तो आपके वेब पेज की इच्छित कार्यक्षमता में आपका एक बड़ा छेद होगा। –

+0

एक वेब-आधारित ग्रिड नियंत्रण का उपयोग करके जिसे आप एम्बेड कर सकते हैं, मुझे लगता है कि अधिक समझदारी होगी। यदि आपको उपयोगकर्ता को अन्य कोशिकाओं का संदर्भ देने वाले सूत्र बनाने की अनुमति नहीं है, तो ग्रिड-नियंत्रण डेटा इनपुट के लिए ग्रिड नियंत्रण उत्कृष्ट हैं। –

+0

हां, वेब ऐप कॉर्पोरेट क्लाइंट द्वारा उपयोग किए जाने वाले इंट्रानेट को एक्सेल स्थापित करने की गारंटी देता है। – user53564

0

मुझे लगता है कि आईई में होस्ट किए गए नियंत्रण से विंडोज का उपयोग करने का आपका दूसरा दृष्टिकोण भी काम नहीं करेगा।

आईई एक स्क्रिप्टिंग होस्ट के रूप में अलग व्यवहार करता है। वहाँ कुछ सीमाएं के रूप में एक ब्लॉग पोस्ट एरिक Lippert द्वारा उल्लेख कर रहे हैं:

Implementing Event Handling, Part Two

संबंधित मुद्दे