VSTO4.0创建EXCEL自定义函数
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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;(此引用需事先在解决方案资源管理器那里添加,否则无法引用)
四、编写函数完毕,即可进行编译生成,在编译之前,有必要设置一些选项。
进入菜单栏-》项目-》(项目名称)属性
打开属性设置窗体,进入“生成”项