程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> 如何給Excel添加用戶自定義的公式

如何給Excel添加用戶自定義的公式

編輯:.NET實例教程

Excel允許我們自定義公式。過去的方法是通過一種叫XLL的特殊DLL來實現。但是XLL不能用托管代碼來寫。現在,用托管代碼如何實現自定義公式呢?很簡單,Excel支持一種叫自動化插件的技術,可以使用C#VB.Net開發。

1. 打開Visual Studio 2005創建一個新的C#類庫項目,取名叫AutomationAddIn

2. 然後在Class1.cs中添加如下的代碼

using System;
using System.Runtime.InteropServices;
using Microsoft.Win32;

namespace AutomationAddin
{
  [ClassInterface(ClassInterfaceType.AutoDual), ComVisible(true)]
  public class MyFunctions
  {
    public MyFunctions()
    {

    }

    public double MultiplyNTimes(double Number1, double Number2, double TimesToMultiply)
    {
      double result = Number1;
      for (double i = 0; i < TimesToMultiply; i++)
      {
        result = result * Number2;
      }

      return result;
    }

    [ComRegisterFunctionAttribute]
    public static void RegisterFunction(Type type)
    {
      Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type));
    }

    [ComUnregisterFunctionAttribute]
    public static void UnregisterFunction(Type type)
    {
      Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type),false);
    }

private static string GetSubKeyName(Type type)
    {
      string s = @"CLSID\{" + type.GUID.ToString().ToUpper() + @"}\Programmable";
      return s;
    }
  }
}

3. 點擊菜單Project-PropertIEs,選中Build頁,勾上Register for COM interop.

4. 編譯整個類庫項目

5. 啟動Excel,調出Add Ins對話框(0307有不同,見文後PS)

6. 點擊Automation按鈕,將出現Automation Servers對話框,選中我們剛剛建的AutomationAddIn.MyFunctions (此處為剛剛類庫項目的命名空間名+類名)

7. 點擊OK按鈕(這時會出現一個對話框,選擇),將回到Add Ins對話框

8.OK按鈕。

9. 測試我們的函數。在一個sheetA1輸入3A2輸入4A3輸入5。選中A4,點擊公式欄中的fx按鈕,跳出公式選擇對話框。在分類下拉框中選擇AutomationAddIn.MyFunctions, 然後選中公式MultiplyNTimes。點擊OK

10. 跳出函數參數對話框,分別輸入A1A2A3,點擊OK

11. 回到工作表格,如下 3072 = 3*4*4*4*4*45次)

12. 由此可見,自定義的公式生效了,事實上我們還可以在類庫中添加進一些更加有用的功能。隨便列出幾個如下:

public string GetStars(double Number)
{
  string s = "";
  for (double i = 0; i < Number; i++)
  {
    s = s + "*";

 }
  return s;
}

public double AddNumbers(double Number1, [Optional] object Number2, [Optional] object Number3)
{
  double result = 0;
  result += Convert.ToDouble(Number1);

  if (!(Number2 is System.Reflection.Missing))
  {
    Excel.Range r2 = Number2 as Excel.Range;
    double d2 = Convert.ToDouble(r2.Value2);
    result += d2;
  }

  if (!(Number3 is System.Reflection.Missing))
  {
    Excel.Range r3 = Number3 as Excel.Range;
    double d3 = Convert.ToDouble(r3.Value2);
    result += d3;
  }

  return result;
}

public double CalculateArea(object Range)
{
  Excel.Range r = Range as Excel.Range;
  return Convert.ToDouble(r.Width) + Convert.ToDouble(r.Height);
}

public double NumberOfCells(object Range)
{
  Excel.Range r = Range as Excel.Range;
  return r.Cells.Count;
}

public string ToUpperCase(string input)
{
  return input.ToUpper();
}

 

PS:調出AddIns對話框

·         2003Menu Tools->Add Ins

·         2007Office Button->Excel Options->Add ins->Excel Add Ins

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved