我要做的是使用 VSTO 的 C#“Excel 2007 插件”项目类型为 Excel 创建用户定义函数 (UDF)(因为我只想生成一些通用 UDF)。因为我只是想学习基础知识(无论如何在这个阶段),这就是我的代码的样子:
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 会弹出一个新的电子表格,当我查看“加载项”列表(在 Excel 选项中)时,我可以在列表中看到我的加载项(设置到“启动时加载)。但是我的问题来了,当我尝试从 Excel 中调用我的 UDF 时,Excel 找不到该方法!
我想错了,我必须将我的方法标记为 Excel UDF(使用方括号 - 例如在编写 webservices -> “[WebService]”时所做的)。但是我一直没能找到这个标签(因为我根本不确定我的预感是否正确),这就是为什么我决定去找你们这里的好人。
所以我的问题基本上是——从我的代码那里,有什么简单的方法可以让 Excel 访问我的 UDF?如果是,如何?
我真的很想留在 VSTO 项目类型(加载项、工作簿、模板)中,因为我当前项目的总体目标是确定使用 VS2010/Excel2007 执行 C# UDF 是否以可接受的速度工作。为了测试这一点,我正在使用 Windows7RC 和 VS2010 beta1。