VSTO4.0创建EXCEL自定义函数

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

前段时间装了个visual studio 2010,试着用里面的VSTO4.0,但是对如何生成一个自定义函数始终搞不明白(之前也看了《VSTO开发指南》,但觉得里面所讲的东西太泛了,而且版本不一样,形式也改变了不少),终于在网上看到有人写出一个完整的过程(原文请看/brooks-dotnet/archive/2011/01/16/1936871.html),但在实操中还是有不少问题,但经过多次尝试,终于解决了所遇到的问题,现在我就根据原文的内容以及建立过程中所遇到的问题,重新整理后讲述建立一个自定义函数的过程。

一、启动VS2010,(这里尝试着用C#来编写)新建一个类库,填好名称之后按确定,开始编码。

二、进入编程界面后,先引用必须的类库

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Runtime.InteropServices;

using Microsoft.Win32;

using Microsoft.Office.Interop.Excel

设置GUID及COM的一些特性

[Guid("A4AAE79B-9587-4014-BABB-966C5DF76C83")]

[ClassInterface(ClassInterfaceType.AutoDual),ComVisible(true)]

如图示:

Guid这个标识码可用LINQPad程序来获取(可从/下载)

在类中,除了有函数主体外,还必须有注册及注销时的行为语句,所以必须添加以下语句:#regi on COM Related

[ComRegisterFunction]

public static void Regi sterFunction(Type type)

{

Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type, "Programmable"));

var key = Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type, "InprocServer32"), true);

key.SetValue("", Environment.SystemDirectory + @"\mscoree.dll", Regi stryValueKind.String);

}

[ComUnregisterFunction]

public static void Unregi sterFuncti on(Type type)

{

Registry.ClassesRoot.DeleteSubKey(GetSubKeyName(type, "Programmable"), false);

}

private static string GetSubKeyName(Type type, string subKeyName)

{

var s = new System.Text.StringBuilder();

s.Append(@"CLSID\{");

s.Append(type.GUID.ToString().ToUpper());

s.Append(@"}\");

s.Append(subKeyName);

return s.ToString();

}

#endregi on

如图示:

三、这些准备工作完毕后就可以写自己的函数主体了,这里以一个自定义的字符串联结为例:

public string MyConcate(params Object[] values)

{

string iStr = "";

Range iRng;

for (int iStep = 0; iStep < values.Length; iStep++)

{

if (values[iStep].ToString() == "System.__ComObject")

{

iRng = (Range)val ues[iStep];

if (iRng.Count > 1)

{

foreach(Range cRng in iRng)

{

iStr += Convert.ToString(cRng.Value);

}

}

else

{

iStr += Convert.ToString(iRng.Value);

}

}

else

{

iStr += values[iStep].ToString();

}

}

return iStr;

}

注:由于这里是用了params来传递不定数量的参数,所以需要把Object强制转换为Range类型,否则直接写iStr += values[iStep].ToString(); 只能获取到一个“Object”字符串,由于需要强制转换,所以要加入另外一个引用using Microsoft.Office.Interop.Excel;(此引用需事先在解决方案资源管理器那里添加,否则无法引用)

四、编写函数完毕,即可进行编译生成,在编译之前,有必要设置一些选项。

进入菜单栏-》项目-》(项目名称)属性

打开属性设置窗体,进入“生成”项

相关文档
最新文档