2009-07-16 15 views
12

एक्सेस करना मैं प्रोग्रामवर्क के लिए बनाई गई कार्यपुस्तिका में कस्टम गुण जोड़ने की कोशिश कर रहा हूं। मेरे पास गुणों को प्राप्त करने और सेट करने के लिए एक विधि है, लेकिन समस्या यह है कि वर्कबुक कस्टम डॉक्यूमेंटप्रॉपर्टीज संपत्ति के लिए शून्य लौट रहा है। मैं इस संपत्ति को आरंभ करने का तरीका नहीं समझ सकता ताकि मैं कार्यपुस्तिका से गुणों को जोड़ और पुनर्प्राप्त कर सकूं। Microsoft.Office.Core.DocumentProperties एक इंटरफेस है, इसलिए मैं नहीं कर सकते जाने के लिए और निम्न कार्यExcel कस्टम दस्तावेज़ गुणों को प्रोग्रामेटिक रूप से

if(workbook.CustomDocumentProperties == null) 
    workbook.CustomDocumentProperties = new DocumentProperties; 

यहाँ कोड मैं हो और गुणों को सेट करने के लिए है है:

 private object GetDocumentProperty(string propertyName, MsoDocProperties type) 
    { 
     object returnVal = null; 

     Microsoft.Office.Core.DocumentProperties properties; 
     properties = (Microsoft.Office.Core.DocumentProperties)workBk.CustomDocumentProperties; 

     foreach (Microsoft.Office.Core.DocumentProperty property in properties) 
     { 
      if (property.Name == propertyName && property.Type == type) 
      { 
       returnVal = property.Value; 
      } 
      DisposeComObject(property); 
     } 

     DisposeComObject(properties); 

     return returnVal; 
    } 

    protected void SetDocumentProperty(string propertyName, string propertyValue) 
    { 
     DocumentProperties properties; 
     properties = workBk.CustomDocumentProperties as DocumentProperties; 

     bool propertyExists = false; 
     foreach (DocumentProperty prop in properties) 
     { 
      if (prop.Name == propertyName) 
      { 
       prop.Value = propertyValue; 
       propertyExists = true; 
      } 
      DisposeComObject(prop); 

      if(propertyExists) break; 
     } 

     if (!propertyExists) 
     { 
      properties.Add(propertyName, false, MsoDocProperties.msoPropertyTypeString, propertyValue, Type.Missing); 
     } 

     DisposeComObject(propertyExists); 

    } 

लाइन गुण = workBk.CustomDocumentProperties दस्तावेज़ प्रॉपर्टीज के रूप में; हमेशा गुणों को शून्य पर सेट करें।

यह Microsoft.Office.Core v12.0.0.0 और Microsoft.Office.Interop.Excell v12.0.0.0 (Office 2007)

उत्तर

10

मैं अपने खुद के कोड को देखा और कहा कि मैं पहुँच देख सकते हैं उपयोग कर रहा है देर बाध्यकारी का उपयोग कर गुण। मुझे याद नहीं है क्यों, लेकिन अगर यह मदद करता है तो मैं कुछ कोड पोस्ट करूंगा।

object properties = workBk.GetType().InvokeMember("CustomDocumentProperties", BindingFlags.Default | BindingFlags.GetProperty, null, workBk, null); 

object property = properties.GetType().InvokeMember("Item", BindingFlags.Default | BindingFlags.GetProperty, null, properties, new object[] { propertyIndex }); 

object propertyValue = property.GetType().InvokeMember("Value", BindingFlags.Default | BindingFlags.GetProperty, null, propertyWrapper.Object, null); 

संपादित: आह, अब मैं why याद है। :-)

संपादित 2: Jimbojones 'जवाब - गतिशील कीवर्ड का उपयोग करने के लिए - (यदि आप आसानी से उपयोग dynamic का उपयोग करने का प्रदर्शन भूमि के ऊपर से अधिक मूल्य) एक बेहतर समाधान है।

+0

लिंक मैंने पाया बंधन बिल्कुल के लिए dynamic कुंजी शब्द का उपयोग कर सकते, और मैं अपने कोड पोस्ट किया है, जबकि आप इस पोस्टिंग कर रहे थे। +1 और आपके लिए स्वीकृत :-) –

+0

"क्यों" पर लिंक करने के लिए अपडेट करें: https://support.microsoft.com/en-us/kb/303296 –

7

मुझे समाधान here मिला।

यहाँ कोड मैं के साथ समाप्त हो गया है:

public void SetDocumentProperty(string propertyName, string propertyValue) 
    { 
     object oDocCustomProps = workBk.CustomDocumentProperties; 
     Type typeDocCustomProps = oDocCustomProps.GetType(); 

     object[] oArgs = {propertyName,false, 
       MsoDocProperties.msoPropertyTypeString, 
       propertyValue}; 

     typeDocCustomProps.InvokeMember("Add", BindingFlags.Default | 
            BindingFlags.InvokeMethod, null, 
            oDocCustomProps, oArgs); 

    } 

    private object GetDocumentProperty(string propertyName, MsoDocProperties type) 
    { 
     object returnVal = null; 

     object oDocCustomProps = workBk.CustomDocumentProperties; 
     Type typeDocCustomProps = oDocCustomProps.GetType(); 


     object returned = typeDocCustomProps.InvokeMember("Item", 
            BindingFlags.Default | 
            BindingFlags.GetProperty, null, 
            oDocCustomProps, new object[] { propertyName }); 

     Type typeDocAuthorProp = returned.GetType(); 
     returnVal = typeDocAuthorProp.InvokeMember("Value", 
            BindingFlags.Default | 
            BindingFlags.GetProperty, 
            null, returned, 
            new object[] { }).ToString(); 

     return returnVal; 
    } 

कुछ अपवाद संचालन सौंपने के लिए आवश्यक है अगर संपत्ति मौजूद नहीं करता है जब इस सवाल का

3

देर जवाब लिया गया है, लेकिन मैं एक सरल बाहर काम किया कस्टम दस्तावेज़ प्रॉपर्टीज जोड़ने के लिए विधि जो भविष्य में किसी के लिए उपयोग की जा सकती है।

मेरी समस्या यह थी कि System.String.GetType() द्वारा प्रदान की गई सिस्टम प्रकार के साथ Add() विधि को कॉल करना एक COMException ट्रिगर किया गया: टाइप मिस्चैच। पिछले जवाब में लिंक का जिक्र करते हुए यह स्पष्ट है कि इस विधि किसी Office-विशिष्ट प्रकार की उम्मीद है, तो कोड है कि मेरे लिए काम समाप्त हो गया था:

var custProps = (Office.DocumentProperties)this.CustomDocumentProperties; 
custProps.Add("AProperty", false, MsoDocProperties.msoPropertyTypeString, "AStringProperty"); 

क्योंकि यह एक CustomDocumentProperty कार्यालय बिना किसी कठिनाई के कस्टम गुण जोड़ देगा है , लेकिन यदि आपको अस्तित्व की जांच करने या मूल्य को सत्यापित करने की आवश्यकता है जब कस्टम डॉक्यूमेंट प्रॉपर्टी मौजूद नहीं हो सकता है तो आपको सिस्टम को पकड़ना होगा। ऑर्ग्यूमेंट अपवाद।

संपादित

के रूप में ओलिवर बोक की टिप्पणी में बताया, यह एक ऑफिस 2007 और ऊपर एकमात्र समाधान, के रूप में तक मुझे पता है है।

+1

मुझे लगता है (एक्सेल 2000 के साथ) कि मैं कार्यपुस्तिका नहीं डाल सकता। कस्टम डॉक्यूमेंट प्रॉपर्टीज Office.DocumentProperties के लिए। हालांकि, अन्य उत्तरों में प्रतिबिंब कोड काम करता है। –

+0

आह, हाँ - मुझे ध्यान दिया जाना चाहिए था (और अब ऐसा किया है) कि मुझे विश्वास है कि यह एक कार्यालय 2007 है और केवल एक विशेषता है (हालांकि यह 2003 में काम कर सकता है - अब परीक्षण करने के लिए मुझे उस तक पहुंच नहीं है)। मेरी रक्षा में, मूल पोस्टर इसका उपयोग कर रहा था। – cori

12

यदि आप .NET 4 को लक्षित कर रहे हैं।0, आप देर से

Document doc = GetActiveDocument(); 
if (doc != null) 
{ 
    dynamic properties = doc.CustomDocumentProperties; 
    foreach (dynamic p in properties) 
    { 
     Console.WriteLine(p.Name + " " + p.Value); 
    } 
} 
संबंधित मुद्दे