2009-06-05 7 views
16

मैं जो करने का प्रयास कर रहा हूं वह है VSTO के सी # "एक्सेल 2007 एड-इन" -प्रोजेक्ट प्रकार का उपयोग कर एक्सेल के लिए उपयोगकर्ता परिभाषित फ़ंक्शन (यूडीएफ) बनाना (क्योंकि मैं बस कुछ सामान्य यूडीएफ उत्पन्न करना चाहते हैं)। मैं केवल (इस स्तर किसी भी तरह से) मूल बातें जानने के लिए कोशिश कर रहा हूँ के रूप में इस तरह मेरे कोड दिखता है:VSTO ऐड-इन प्रोजेक्ट के साथ आसानी से एक्सेल यूडीएफ कैसे बनाएं

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Xml.Linq; 
using Excel = Microsoft.Office.Interop.Excel; 
using Office = Microsoft.Office.Core; 
using Microsoft.Office.Tools.Excel; 
using Microsoft.Office.Tools.Excel.Extensions; 
using System.Runtime.InteropServices; 

namespace ExcelAddIn1 
{ 
    public partial class ThisAddIn 
    { 
     private void ThisAddIn_Startup(object sender, System.EventArgs e) 
     {} 

     private void ThisAddIn_Shutdown(object sender, System.EventArgs e) 
     {} 

     //My UDF 
     public static double HeronicCal(int a, int b, int c) 
     { 
      //first compute S = (a+b+c)/2 
      double S = (a + b + c)/2;  
      double area = Math.Sqrt(S * (S - a) * (S - b) * (S - c)); 
      return area; 
     } 

     #region VSTO generated code 

     /// <summary> 
     /// Required method for Designer support - do not modify 
     /// the contents of this method with the code editor. 
     /// </summary> 
     private void InternalStartup() 
     { 
      this.Startup += new System.EventHandler(ThisAddIn_Startup); 
      this.Shutdown += new System.EventHandler(ThisAddIn_Shutdown); 
     }    
     #endregion 
    } 
} 

यह ठीक संकलित, और जब मैं इसे चलाने, एक्सेल एक ताजा स्प्रेडशीट के साथ पॉप अप होता है, और जब मैं "ऐड-इन्स" सूची (एक्सेल विकल्पों में) देखता हूं, मैं सूची में अपना ऐड-इन देख सकता हूं (जो "स्टार्टअप पर लोड" पर सेट है। लेकिन यहां मेरी समस्या आती है, जब मैं अपने यूडीएफ को एक्सेल में कॉल करने का प्रयास करता हूं, तो Excel को विधि नहीं मिल सकती है!

जो मैं कल्पना करता हूं वह गलत है, यह है कि मुझे अपनी विधि को एक्सेल यूडीएफ (स्क्वायर ब्रैकेट्स का उपयोग करके टैग करना है - उदाहरण के लिए वेब सर्विसेज कोडिंग करते समय -> "[वेब सेवा]")। लेकिन मैं इस टैग को ट्रैक करने में सक्षम नहीं हूं (और जब से मेरा हंच सही है तो मुझे यकीन नहीं है), इसलिए मैंने यहां आपको ठीक लोगों के पास जाने का फैसला किया है।

तो मेरा प्रश्न मूल रूप से है - जहां से मैं अपने कोड के साथ हूं, क्या मेरे यूडीएफ एक्सेल के लिए सुलभ बनाने का कोई आसान तरीका है? यदि हां, तो कैसे?

मैं वास्तव में वीएसटीओ प्रोजेक्ट-प्रकार (ऐड-इन, वर्कबुक, टेम्पलेट) के भीतर रहना चाहता हूं, क्योंकि मेरी वर्तमान परियोजना के लिए मेरा समग्र लक्ष्य यह स्थापित करना है कि VS2010/Excel2007 के साथ सी # यूडीएफ निष्पादन एक पर काम करता है या नहीं स्वीकार्य गति। इसका परीक्षण करने के लिए मैं विंडोज 7 आरसी और वीएस -2010 बीटा 1 के साथ काम कर रहा हूं।

उत्तर

8

जहां तक ​​मुझे पता है, आप सीधे VSTO में यूडीएफ नहीं बना सकते हैं।

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

यूएसएफ बनाने के लिए आप प्रबंधित कोड का उपयोग कर सकते हैं, हालांकि, VSTO का उपयोग नहीं करते समय। यह कैसे करें इस पर एरिक कार्टर का आलेख Writing user defined functions for Excel in .NET देखें।

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

प्रदर्शित करने के लिए, निम्नलिखित एक क्षेत्र, प्रक्रिया मूल्यों से मूल्यों की एक दो आयामी सरणी वापस आ जाएगी, और फिर एक शॉट में मूल क्षेत्र के लिए वापस जिसके परिणामस्वरूप सरणी पारित:

Excel.Range rng = myWorksheet.get_Range("A1:D4", Type.Missing); 

//Get a 2D Array of values from the range in one shot: 
object[,] myArray = (object[,])rng.get_Value(Type.Missing); 

// Process 'myArray' however you want here. 
// Note that the Array returned from Excel is base 1, not base 0. 
// To be safe, use GetLowerBound() and GetUpperBound: 
for (int row = myArray.GetLowerBound(0); row <= myArray.GetUpperBound(0); row++) 
{ 
    for (int column = myArray.GetLowerBound(1); column <= myArray.GetUpperBound(1); column++) 
    { 
     if (myArray[row, column] is double) 
     { 
      myArray[row, column] = (double)myArray[row, column] * 2; 
     } 
    } 
} 

// Pass back the results in one shot: 
rng.set_Value(Type.Missing, myArray); 

आशा इस मदद करता है !

माइक

19

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

आपको ExcelDna - http://www.codeplex.com/exceldna पर एक नज़र रखना चाहिए। एक्सेलडेना देशी असेंबली के माध्यम से एक्सेल में उपयोगकर्ता परिभाषित कार्यों (यूडीएफ) और मैक्रोज़ को बेनकाब करने के लिए प्रबंधित असेंबली की अनुमति देता है। परियोजना ओपन-सोर्स है और स्वतंत्र रूप से व्यावसायिक उपयोग की अनुमति देती है। और आप पाएंगे कि आपके .NET- आधारित UDF का प्रदर्शन Excel के लिए देशी .xll ऐड-इन्स के समान है। एक्सेल 2007 की विशेषताएं बड़ी शीट, लंबी यूनिकोड स्ट्रिंग्स और बहु-थ्रेडेड पुनर्मूल्यांकन की तरह समर्थित हैं।

एक्सेलडेना के साथ उपर्युक्त पोस्ट के रूप में आपका कार्य एक्सेल के सामने कोई VSTO नहीं होगा - आप कोड को xml- आधारित .dna फ़ाइल में डाल सकते हैं या इसे .dll पर संकलित कर सकते हैं।

.dna फ़ाइल अपने यूडीएफ को उजागर इस प्रकार दिखाई देगा:

<DnaLibrary Language="C#"> 
    using System; 
    using ExcelDna.Integration; 

    public class MyFunctions 
    { 
     [ExcelFunction(Description="Calculate Stuff", Category="Cool Functions")] 
     public static double HeronicCal(int a, int b, int c) 
     { 
     //first compute S = (a+b+c)/2 
     double S = (a + b + c)/2; 
     double area = Math.Sqrt(S * (S - a) * (S - b) * (S - c)); 
     return area;   
     } 
    } 
</DnaLibrary> 

अद्यतन: इन दिनों, सबसे आसान तरीका है दृश्य में एक नई कक्षा लाइब्रेरी परियोजना बनाने के लिए किया जाता है एक्सेल-डीएनए के साथ आरंभ करने के लिए स्टूडियो, फिर NuGet से 'ExcelDna.AddIn' पैकेज जोड़ें। इससे स्टार्टर एड-इन बनता है - बस अपना कोड पेस्ट करें और चलाने के लिए F5 दबाएं।

7

ऐसा लगता है कि एरिक कार्टर यहाँ एक विजेता है:

http://blogs.msdn.com/b/eric_carter/archive/2004/12/01/273127.aspx

यह शुद्ध नेट है - तीसरे पक्ष के पुस्तकालयों पर कोई निर्भरता।

यह एक बर्ल अब दे ...

+0

यह उत्तर IMHO ऊपर होना चाहिए। कोई 3 डी पार्टी पुस्तकालय और बहुत कम बॉयलरप्लेट बड़े पेशेवर हैं। – Sebastiaan

0

क्या मैं पाया है कि अच्छी तरह से काम करता है यूडीएफ एक वीबी मॉड्यूल COM ऑब्जेक्ट के साथ मुद्दों से बचने के रूप में रखने के लिए है।

मैं बनाने और चलाने के सी # कोड की टन मिल गया है जब मैं रिहाई मैं निम्न कार्य बनाने के लिए तैयार कर रहा हूँ:
1. एक मॉड्यूल जोड़ें:
      डेवलपर [Excel में टैब] | विजुअल बेसिक -> परियोजना खिड़की, राइट-क्लिक करें, सम्मिलित मॉड्यूल
      - केवल कॉपी/VB कोड यहाँ
2. उपयुक्त संदर्भ पुस्तकालय (समान वीबी विंडो में, टूल्स) शामिल पेस्ट
3. सहेजें एक्सेल एक .xlsm (यानी, मैक्रो-सक्षम) के रूप में फ़ाइल करें

फिर आप .xlsx फ़ाइल को हटा सकते हैं।

मैं जो करता हूं वह पूरी निर्देशिका ज़िप (उदाहरण के लिए, "रिलीज") है और इसे हमारे उपयोगकर्ताओं को भेजता है।

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