2011-11-30 15 views
5

मेरा लक्ष्य एक्सेल ट्रस्ट सेंटर में "वीबीए प्रोजेक्ट ऑब्जेक्ट मॉड्यूल पर ट्रस्ट एक्सेस" सक्षम किए बिना एक्सेल वर्कबुक में मैक्रोज़ जोड़ना है। (पहुंच को सक्षम करना एक सुरक्षा जोखिम लगता है)।इंटरऑप का उपयोग किये बिना एक्सेल .xlsm में वीबीए कोड इंजेक्ट कैसे करें?

खोज के शुरुआती तथ्य पर पहेली के यादृच्छिक टुकड़े मिले: - मुझे लगता है कि वीबीए स्क्रिप्ट zipped .xlsm फ़ाइल में vbaProject.bin के रूप में संग्रहीत है। , वहाँ कई मुफ्त/वाणिज्यिक संसाधन है कि एक्सेल फाइलों के साथ काम कर सकते हैं: Create excel without interop and template with or without row and columnspan

यह बस सी # परियोजना है कि सी # कोड से खींचती है और एक्सेल दस्तावेज़ में इंजेक्शन में VBA स्क्रिप्ट की एक फ़ाइल के लिए अच्छा होगा वीबीए इंटरऑप के बिना। ऐसा करने के लिए कोई त्वरित/तेज़/सरल/सीधा तरीका है या क्या मुझे ऊपर से जुड़े मुफ्त/वाणिज्यिक संसाधनों के साथ खेलना चाहिए?

उत्तर

6

OpenXML SDK 2.0 का उपयोग करना:

  1. अपने मैक्रो कोड बनाएँ और .xlsm प्रारूप में बचाने के लिए, snorehorse.xlsm का कहना है।
  2. ओपनएक्सएमएल उत्पादकता टूलकिट में खोलें snorehorse.xlsm और पेड़ की जड़ पर एक प्रतिबिंब कोड करें।
  3. मैक्रो के बाइनरी कोड को खोजें। यह एक स्ट्रिंग प्रारूप में है और यादृच्छिक वर्णों की तरह दिखता है।
  4. अपने आईडीई में, ओपनएक्सएमएल एसडीके का संदर्भ जोड़ें, और एक्सेल फ़ाइल को प्रोग्रामेटिक रूप से बनाएं या खोलें जिसे आप मैक्रो कोड इंजेक्ट करना चाहते हैं।
  5. चरण # 3 में आपके कोड में मिली मैक्रो स्ट्रिंग की प्रतिलिपि बनाएँ।
  6. गंतव्य के लिए एक नया vba हिस्सा जोड़ें।
  7. स्ट्रिंग डेटा को नए vba भाग में फ़ीड करें।
  8. सहेजें और चलाएं और आपको ट्रस्ट सेंटर को छोड़कर प्रसन्नता हो।

उदाहरण कोड:

using DocumentFormat.OpenXml; 
using DocumentFormat.OpenXml.Packaging; 
using DocumentFormat.OpenXml.Spreadsheet; 

private string partData = "..."; 

    public void vbaInjector{  
     [code to create/open spreadsheet using OpenXML omitted] 
     VbaProjectPart vbaProjectPart1 = snoreSpreadsheetDoc.WorkbookPart.AddNewPart<VbaProjectPart>("rId8"); 
     System.IO.Stream data = GetBinaryDataStream(partData); 
     vbaProjectPart1.FeedData(data); 
     data.Close(); 
     [code to close spreadsheet and cleanup omitted] 
    } 


    private System.IO.Stream GetBinaryDataStream(string base64String) 
    { 
     return new System.IO.MemoryStream(System.Convert.FromBase64String(base64String)); 
    } 

मैं परियोजना के स्थानीय निर्माण में OpenXML SDK dll जोड़ने के लिए तो अंत उपयोगकर्ताओं एसडीके खुद को स्थापित करने के लिए नहीं होगा चुना है।

मुझे लगता है कि यह ओपनएक्सएमएल एसडीके का उपयोग किए बिना एक्सएमएल के साथ काम कर रहे निचले स्तर पर किया जा सकता है, लेकिन मैंने यह सीखने का प्रयास नहीं किया है कि यह कैसे करें। अगर कोई कोड पोस्ट कर सकता है, तो मैं उस पर उत्तर स्वीकार करूंगा।

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

धन्यवाद।

+0

क्या यह अभी भी काम करता है? मैं निश्चित रूप से अभी इस कोशिश करूँगा। –

+0

1 घंटे के बाद भी मैं अपने प्रोजेक्ट में किसी भी कोड को दूषित किए बिना इंजेक्ट नहीं कर सकता। केवल तभी काम करता है जब मैं OpenXML टूलकिट द्वारा प्रतिबिंबित सभी कोड निष्पादित करता हूं। –

+0

अंधेरे में गोली मार दी ... शायद "आरआईडी 8" पहले ही इस्तेमाल हो चुकी है? इसे "rId888" जैसे कुछ में बदलने के बारे में कैसे? – Snorex

1

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

Writing and Executing VBA Macros on Excel without using Excel.Interop

+0

लिंक केवल उत्तर ही लोगों को मदद करने का सबसे अच्छा तरीका नहीं है –

+1

भले ही लिंक किसी अन्य स्टैक ओवरफ़्लो उत्तर को इंगित करता हो? क्या मुझे इसे कॉपी-पेस्ट करना चाहिए? –

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