2009-06-26 19 views
64

मैं वर्तमान में गतिशील टाइपिंग के बारे में लिख रहा हूं, और मैं एक्सेल इंटरऑप का एक उदाहरण दे रहा हूं। मैंने पहले ही कोई ऑफिस इंटरऑप नहीं किया है, और यह दिखाता है। सी # 4 के लिए MSDN Office Interop tutorial_Worksheet इंटरफ़ेस का उपयोग करता है, लेकिन Worksheet इंटरफ़ेस भी है। मुझे नहीं पता कि अंतर क्या है।एक्सेल इंटरऑप: _ वर्कशीट या वर्कशीट?

मेरे बेतुका सरल डेमो ऐप (नीचे दिखाया गया) में या तो ठीक काम करता है - लेकिन यदि सर्वोत्तम अभ्यास एक या दूसरे को निर्देशित करता है, तो मैं इसे उचित रूप से उपयोग करना चाहता हूं।

using System; 
using System.Linq; 
using Excel = Microsoft.Office.Interop.Excel; 

class DynamicExcel 
{ 
    static void Main() 
    { 
     var app = new Excel.Application { Visible = true }; 
     app.Workbooks.Add(); 

     // Can use Excel._Worksheet instead here. Which is better? 
     Excel.Worksheet workSheet = app.ActiveSheet; 

     Excel.Range start = workSheet.Cells[1, 1]; 
     Excel.Range end = workSheet.Cells[1, 20]; 
     workSheet.get_Range(start, end).Value2 = Enumerable.Range(1, 20) 
                  .ToArray(); 
    } 
} 

मैं कॉम या कार्यालय अंतर में एक पूर्ण गहन कर रही है, बस सी # 4 की नई सुविधाओं पर प्रकाश डाला से बचने के लिए कोशिश कर रहा हूँ - लेकिन मैं कुछ भी सच में, सच गूंगा करने के लिए नहीं करना चाहती।

(वास्तव में कुछ भी हो सकता है, वास्तव में ऊपर दिए गए कोड में वास्तव में गूंगा हो सकता है, इस मामले में कृपया मुझे बताएं। "ए 1: टी 1" की जगह अलग-अलग प्रारंभ/अंत कोशिकाओं का उपयोग जानबूझकर है - यह देखना आसान है यह वास्तव में 20 कोशिकाओं की एक श्रृंखला है। कुछ और शायद आकस्मिक है।)

तो, क्या मुझे _Worksheet या Worksheet का उपयोग करना चाहिए, और क्यों?

+5

जॉन, उत्कृष्ट जवाब के अलावा यहां दिया जा रहा, मैं इसे जोड़ता हूं, आम तौर पर, इंटरऑप के माध्यम से एक्सेल के साथ काम करते समय कक्षा के नाम का उपयोग करें क्योंकि यह आमतौर पर एक्सेल में दिखाई देता है। इसका मतलब है '_Worksheet' के बजाय 'वर्कशीट' का उपयोग करें, और 'एप्लिकेशन क्लास' के बजाय 'एप्लिकेशन' का उपयोग करें। (यहां एक चर्चा बताती है कि 'एप्लिकेशन क्लास' का उपयोग क्यों न करें: http://blogs.msdn.com/ptorr/archive/2004/02/05/67872.aspx।) यदि आप एक्सेल ऑब्जेक्ट मॉडल से परिचित नहीं हैं COM के संपर्क में आने के बाद, यह मुश्किल हो सकता है, लेकिन मुझे लगता है कि यह ज्यादातर समय स्पष्ट होना चाहिए। –

+0

सौभाग्य से मैं कार्यालय के साथ * बहुत * छोटा कर रहा हूं - वास्तव में बस नई सुविधाओं को दिखाने की कोशिश कर रहा हूं। यद्यपि लिंक के लिए बहुत बहुत धन्यवाद - बहुत उपयोगी! –

+0

मुझे खेद है, लेकिन पूछना है - सी # 4 की नई सुविधा क्या है जिसे आप हाइलाइट कर रहे हैं? – Oskar

उत्तर

72

अगर मैं सही ढंग याद - और इस पर मेरी स्मृति थोड़ा अस्पष्ट है, के बाद से मैं एक्सेल पिया अलग ले लिया यह एक लंबा समय हो गया है - यह इस तरह है।

एक घटना अनिवार्य रूप से एक विधि है कि एक वस्तु कॉल जब कुछ होता है। .NET में, घटनाएं प्रतिनिधि, सादे और सरल हैं। लेकिन COM में, ईवेंट कॉलबैक के पूरे समूह को इंटरफेस में व्यवस्थित करना बहुत आम है। "भेजे" इंटरफेस, विधियों आप अन्य लोगों को आप पर कॉल करने की उम्मीद है, और "बाहर जाने वाले" इंटरफेस, विधियों आप जब घटनाओं होता अन्य लोगों पर कॉल करने के लिए उम्मीद - इसलिए आप किसी एक वस्तु पर दो इंटरफेस है।

अप्रबंधित मेटाडाटा में - प्रकार लाइब्रेरी - एक रचनात्मक वस्तु के लिए तीन चीजों के लिए परिभाषाएं हैं: इनकमिंग इंटरफ़ेस, आउटगोइंग इंटरफेस, और कोक्लास, जो कहता है "मैं एक रचनात्मक वस्तु हूं जो इसे लागू करता है आने वाले इंटरफ़ेस और यह आउटगोइंग इंटरफ़ेस "।

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

_Workbook इंटरफ़ेस वर्कबुक कोक्लास पर आने वाला इंटरफ़ेस है। वर्कबुक इंटरफ़ेस इंटरफ़ेस है जो कोक्लास स्वयं का प्रतिनिधित्व करता है, और इसलिए _Workbook से विरासत प्राप्त करता है।

लंबी कहानी छोटी, यदि आप आसानी से ऐसा कर सकते हैं तो मैं वर्कबुक का उपयोग करूंगा; _ वर्कबुक एक कार्यान्वयन विस्तार का एक सा है।

+0

यह वर्कशीट/_ वर्कशीट हम यहां बात कर रहे हैं .. आपने जेपी के समान गलतफहमी की है, लेकिन जैसा कि वह बताता है, स्थिति मूल रूप से बराबर है। ;) – Noldorin

7

मैंने देखा है और पिछले कुछ वर्षों में काफी सी #/एक्सेल COM Interop कोड का एक सा लिखा गया है और मैंने देखा है वर्कशीट में लगभग हर मामले में इस्तेमाल किया। मैंने इस विषय पर माइक्रोसॉफ्ट से कुछ भी निश्चित नहीं देखा है।

+0

धन्यवाद। ब्याज से, क्या आप सी # 4 में सुधार के साथ रह रहे हैं? वे * ध्वनि * जैसे कि वे ऑफिस इंटरऑप के मामले में एक बड़ा अंतर डालते हैं, लेकिन अनुभव के बिना मैं वास्तव में अनुमान लगा रहा हूं (उर्फ ब्लफिंग, जब पुस्तक लिखने की बात आती है ...) –

+0

गतिशील/COM इंटरऑप सुधार जब आप COM का उपयोग करना चाहते हैं तो उपयोगी लगें, लेकिन मुझे पूरा यकीन है कि मैं गतिशील सुविधा का उपयोग उस से अधिक के लिए नहीं करूँगा। जिन चीज़ों की मैं वास्तव में उम्मीद कर रहा हूं वे सी # 4/.NET 4 में कोड अनुबंध और कार्य समानांतर लाइब्रेरी हैं। –

6

एमएसडीएन दिखाता है कि Worksheet इंटरफ़ेस केवल _Worksheet और DocEvents_Event इंटरफेस से प्राप्त होता है। ऐसा लगता है कि कोई केवल उन घटनाओं को प्रदान करता है जो वर्कशीट ऑब्जेक्ट अन्य सभी के अतिरिक्त अतिरिक्त हो सकते हैं। जहां तक ​​मैं देख सकता हूं, Worksheet अपने स्वयं के किसी अन्य सदस्य को प्रदान नहीं करता है। तो, हाँ, तुम भी बस सभी मामलों में Worksheet इंटरफ़ेस का उपयोग कर के साथ जाना हो सकता है, क्योंकि आप इसे से कुछ भी खोना नहीं है, और संभवतः घटनाओं यह उजागर करता है की आवश्यकता हो सकती।

+4

जॉन स्कीट * एक प्रश्न पूछ रहा है ?? जवाब देने के लिए मुझे यह दुर्लभ oppurtunity लेना पड़ा! :) – Noldorin

+0

(इसके अलावा, मैं केवल वर्कशीट का उपयोग करना चुन सकता हूं क्योंकि अंडरस्कोर बहुत बदसूरत दिखता है ... लेकिन गंभीरता से ऐसा करने का कोई कारण नहीं है।) – Noldorin

24

आप Reflector में पिया विधानसभा (Microsoft.Office.Interop.Excel) को देखें, तो Workbook इंटरफ़ेस इस परिभाषा है ...

public interface Workbook : _Workbook, WorkbookEvents_Event 

Workbook_Workbook है, लेकिन घटनाओं कहते हैं। के लिए एक ही Worksheet (क्षमा करें, सिर्फ देखा आप Workbooks के बारे में बात कर रहे थे नहीं) ...

public interface Worksheet : _Worksheet, DocEvents_Event 

DocEvents_Event ...

[ComVisible(false), TypeLibType((short) 0x10), ComEventInterface(typeof(DocEvents), 
        typeof(DocEvents_EventProvider))] 
public interface DocEvents_Event 
{ 
    // Events 
    event DocEvents_ActivateEventHandler Activate; 
    event DocEvents_BeforeDoubleClickEventHandler BeforeDoubleClick; 
    event DocEvents_BeforeRightClickEventHandler BeforeRightClick; 
    event DocEvents_CalculateEventHandler Calculate; 
    event DocEvents_ChangeEventHandler Change; 
    event DocEvents_DeactivateEventHandler Deactivate; 
    event DocEvents_FollowHyperlinkEventHandler FollowHyperlink; 
    event DocEvents_PivotTableUpdateEventHandler PivotTableUpdate; 
    event DocEvents_SelectionChangeEventHandler SelectionChange; 
} 

मैं यह सबसे अच्छा शर्त Worksheet उपयोग करने के लिए कह सकते हैं कि, लेकिन यह अंतर है ।

8

वर्ग और आंतरिक उपयोग के लिए इंटरफेस केवल

बचें सीधे निम्नलिखित वर्गों और इंटरफेस, जो आंतरिक रूप से उपयोग और आम तौर पर सीधे इस्तेमाल नहीं कर रहे हैं कर रहे हैं में से किसी का उपयोग कर।

कक्षा/इंटरफ़ेस: उदाहरण

CLASSID कक्षा: ApplicationClass (वर्ड या एक्सेल), WorksheetClass (एक्सेल)

CLASSID घटनाक्रम एक्स _SinkHelper: ApplicationEvents4_SinkHelper (शब्द), वर्कबुकइवेंट्स_SinkHelper (एक्सेल)

_classid: _Application (वर्ड या एक्सेल), _Worksheet (एक्सेल)

ClassID घटनाक्रम एक्स: ApplicationEvents4 (शब्द), AppEvents (एक्सेल)

मैं CLASSID घटनाक्रम x: IAplicationEvents4 (Word), IAppEvents (Excel)

http://msdn.microsoft.com/en-gb/library/ms247299(office.11).aspx

संपादित करें: (पुन: इस उत्तर के स्वरूपण) सही ढंग से स्वरूपित नहीं कर सकते हैं, जिसमें बचा अंडरस्कोर इटैलिक पाठ द्वारा तुरंत पालन किया।पूर्वावलोकन में सही ढंग से पता चलता लेकिन जब तैनात

EDIT2 टूट: यदि आप अंडरस्कोर ही इटैलिक जो धारणात्मक भयानक है, लेकिन एक ही लग रहा है बनाने के काम करता है मुझे लगता है

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