2009-08-20 17 views
6

से Excel 2007 में सी # में लिखित कॉल विधियां मैं Excel 2007 का उपयोग कर रहा हूं। मेरे पास सी # कोड एक अलग बाइनरी में लिखा गया है। कोड कक्षाओं पर स्थिर वर्गों और स्थिर तरीकों का उपयोग करता है। मेरे पास मेरे वीएसटीओ एक्सेल वर्कशीट प्रोजेक्ट में डीएलएल का संदर्भ है। इसे काम करने के लिए मुझे जोड़ने या संशोधित करने के लिए क्या करना है?सेल फॉर्मूला

मेरे सी # कोड इस तरह दिखता है:

using System; 
using System.Collections.Generic; 
using Microsoft.Office.Interop.Excel; 
using System.Runtime.InteropServices; 

namespace FooStatistics 
{ 
    [ComVisible(true)] 
    public static class Statistics 
    { 
     public static int Count(Range range) 
     { 
      return range.Count; 
     } 

मैं एक एक्सेल सेल कि इस तरह दिखता है में एक सूत्र डाल करने के लिए सक्षम होना चाहते हैं:

=FooStatistic.Statistic.Count(A1:A10) 

या जो कुछ भी।

मैंने this देखा है लेकिन यह Excel 2003 में गैर स्थैतिक वर्गों के लिए प्रतीत होता है। मुझे विश्वास नहीं है कि एकीकरण अब तक बेहतर नहीं है।

मैंने इस पर बहुत सारे स्टैक ओवरफ्लो प्रश्नों को देखा है। वे देशी एकीकरण प्रदान नहीं करते हैं (कई कहते हैं, "एक्स ओपन सोर्स लाइब्रेरी का उपयोग करें") और, अशुभ रूप से, ओपी द्वारा कई स्वीकार नहीं किए जाते हैं। मैं नहीं ढूंढ रहा हूं, "इसे एक COM ऑब्जेक्ट में बनाएं और उसे वीबीए से कॉल करें।"

तो मैं तलाश कर रहा हूँ:

  • Excel 2007
  • कोड सी # DLL में यूडीएफ
  • देशी एकीकरण के रूप में एक्सेल सेल

तो यहाँ another StackOverflow link है से

  • कॉल, जिसमें दो उत्तरदाता कहते हैं:

    • जहां तक ​​मुझे पता है, आप सीधे VSTO में यूडीएफ नहीं बना सकते हैं।
    • वीएसटीओ का एक्सेल यूडीएफ बनाने के लिए कोई समर्थन नहीं है। ऑटोमेशन एड-इन्स .Net में बनाया जा सकता है, और ऐसा करने का माइक्रोसॉफ्ट अनुमोदित तरीका प्रतीत होता है।

    यह जून 200 9 से एक प्रश्न है। क्या यह सच है - 200 9 में आपको एक्सेल के लिए कॉल करने योग्य यूडीएफ प्राप्त करने के लिए अपने .NET घटकों को COM सर्वर के रूप में बेनकाब करना होगा?

  • उत्तर

    2

    यदि ये आपकी चार आवश्यकताएं हैं - (1) एक्सेल 2007, (2) कोड सी # डीएलएल में, (3) एक्सेल सेल से यूडीएफ के रूप में कॉल करें, (4) मूल एकीकरण - फिर, हाँ, यह हो सकता है किया, और बहुत आसानी से। ऐसा करने के तरीके पर सबसे अच्छा ट्यूटोरियल में से एक एरिक कार्टर का लेख Writing user defined functions for Excel in .NET है।

    यदि आप अतिरिक्त रूप से चाहते हैं कि आपका कोड वीएसटीओ के माध्यम से होस्ट किया जाए, तो मैं वास्तव में निश्चित हूं कि आपको इस मामले में वीबीए रैपर का उपयोग करने की आवश्यकता है। पॉल स्टब्ब्स के लेख How to create Excel UDFs in VSTO managed code देखें जहां वह वीबीए यूडीएफ का पर्दाफाश करने के लिए वीबीए एड-इन का उपयोग करता है, जो बदले में वीएसटीओ में लिखे गए उनके प्रबंधित यूडीएफ को कॉल करता है।

    हालांकि ईमानदार होने के लिए, एक्सेल यूडीएफ के लिए, मैं बस वीएसटीओ के उपयोग से बचूंगा। वीएसटीओ प्रबंधित COM एड-इन्स के लिए एक महान डिजाइनर है, जिससे आप आसानी से रिबन नियंत्रण और इसी तरह को जोड़ सकते हैं। लेकिन यह यूडीएफ के लिए कोई मदद नहीं है (और वास्तव में, इसका समर्थन भी नहीं करता है)। तो मेरी सलाह है कि Eric Carter's article के अनुसार एक प्रबंधित स्वचालन ऐड-इन बनाएं, और VSTO आवश्यकता को छोड़ दें।

    यदि आप ऐसा करते हैं, तो आपको कोई समस्या नहीं होगी, मैं वादा करता हूं।:-)

    माइक

    +0

    हू। मैं सॉफ्टवेयर विकास के सभी चरणों में जा रहा हूं: क्रोध, इनकार, सौदा, अवसाद और स्वीकृति। – hughdbrown

    +0

    तो जब मैं यह सब करता हूं, तो मुझे संकलन-समय चेतावनी मिलती है "... इसमें कोई भी प्रकार नहीं है जिसे COM इंटरऑप के लिए पंजीकृत किया जा सके।" मुझे संदेह है क्योंकि ऐसा इसलिए है क्योंकि मैंने स्थिर विधियों के साथ एक स्थिर वर्ग का उपयोग किया है। क्या मुझे सार्वजनिक गैर-स्थैतिक कक्षा रखने की आवश्यकता है? या यह कुछ और है? – hughdbrown

    +0

    तो मैं इसे तब तक काम करने के लिए प्राप्त कर सकता हूं जब तक कि मैं स्थिर वर्गों और स्थिर तरीकों का उपयोग नहीं करता। मैं एक फर्जी ऑब्जेक्ट के साथ समाप्त होता हूं जिसमें वास्तविक गुण या विधियां नहीं हैं लेकिन जिन्हें मैं कॉल कर सकता हूं। आह। – hughdbrown

    0

    @ hughdbrown: सिर्फ Erics लेख में उदाहरण का पालन करें। यदि आप ऐसा करते हैं तो यह काम करेगा। नहीं, आप स्थिर वर्ग का उपयोग नहीं कर सकते हैं। एक COM wrapper के साथ एक .net वर्ग instanating (कॉम इंटरऑप के लिए इसे पंजीकृत)।

    1

    ह्यूग,

    मैं नहीं बल्कि "उपयोग एक्स खुला स्रोत पुस्तकालय" के लिए की तुलना में, एक 'स्थानीय' समाधान के लिए अपनी इच्छा को समझते हैं। लेकिन यहां तक ​​कि वीएसटीओ एक्सेल के लिए बहुत 'मूल' प्रतीत नहीं होता है।

    स्वचालन एड-इन्स अपर्याप्त खोजने के बाद एक्सेलडेना (http://exceldna.codeplex.com) विकसित करने के लिए मेरी आवश्यकता बिल्कुल ठीक है। हालिया एक्सेल संस्करणों में ऑटोमेशन एड-इन्स के लिए समर्थन में सुधार नहीं हुआ है, जबकि .xll ऐड-इन एपीआई (जो एक्सेलडेना उपयोग करता है) ने हाल के संस्करणों में अद्यतन समर्थन देखा है, अब बहु-थ्रेडेड पुनर्मूल्यांकन का समर्थन करता है, और एक्सेल में आने वाली एसिंक कॉल के साथ 2010.

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

    गोवर्टर

    +0

    मुझे एक्सेलडीएनए को संक्षिप्त रूप से पसंद आया है। एक समस्या यह है कि ग्राहक अपने स्रोत की रक्षा करना चाहता है। मैं कल्पना नहीं करता कि स्रोत डालने के लिए डीएनए फाइलों को पढ़ने के लिए स्वीकार्य होगा। – hughdbrown

    +0

    यहां एक अभिसरण धागा है: http://stackoverflow.com/questions/1363171/vb-net-com-server-code-way-slower-than-excel-vba-code। मेरी टिप्पणी थी: आपका यूडीएफ स्रोत कोड .dna टेक्स्ट फ़ाइल में हो सकता है, या बाहरी संकलित .NET .dll में हो सकता है। प्रारंभ करना ट्यूटोरियल दिखाता है कि बाहरी पुस्तकालय का संदर्भ कैसे दिया जाए। यदि आप अपना कोड सुरक्षित करना चाहते हैं, तो आपके पास सामान्य .NET obfuscation समस्याएं हैं, और मैं कम से कम कुछ DotFuscator की अनुशंसा करता हूं। लेकिन यह ExcelDna और अन्य .NET समाधानों के बीच अलग नहीं है। – Govert

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