原文:
VSTO 学习笔记(十二)自定义公式与Ribbon
这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果。这次我们来做一个简单的测试,达到类似的目的。
即在Excel 2010中添加一个Ribbon,包含4个自定义公式:仅仅是示例公式加减乘除。
最终效果:
测试代码下载
1、解决方案包含两个项目:
ExcelAddIn:Excel 插件
ExcelUDF:Excel 自定义公式
2、首先创建一个Excel 2010 Add-in项目:
3、添加一个可视化Ribbon:
4、在Ribbon的设计视图中,设置下RibbonTab的属性:
有个ControlIdType属性,当设置为Custom时,此Ribbon显示为Office中独立的一项;当设置为Office时,此Ribbon作为Add-In中的一项出现。
5、在MyRibbon中添加一个Menu,在其中放置四个按钮:
6、创建一个类库项目:
7、编写加减乘除四个函数和COM注册、反注册函数:
View Code
using
System;
using
System.Runtime.InteropServices;
using
Microsoft.Win32;
namespace
ExcelUDF
{
[Guid(
"
E72F44C7-DD4A-4FA2-BC32-4EA9925749DB
"
)]
[ClassInterface(ClassInterfaceType.AutoDual)]
[ComVisible(
true
)]
public
class
ExcelUDF
{
public
int
Add(
int
a,
int
b)
{
return
a
+
b;
}
public
int
Subtract(
int
a,
int
b)
{
return
a
-
b;
}
public
int
Multiply(
int
a,
int
b)
{
return
a
*
b;
}
public
int
Divide(
int
a,
int
b)
{
return
a
/
b;
}
#region
COM Related
[ComRegisterFunction]
public
static
void
RegisterFunction(Type type)
{
Registry.ClassesRoot.CreateSubKey(GetSubKeyName(type,
"
Programmable
"
));
var key
=
Registry.ClassesRoot.OpenSubKey(GetSubKeyName(type,
"
InprocServer32
"
),
true
);
key.SetValue(
""
, Environment.SystemDirectory
+
@"
\mscoree.dll
"
, RegistryValueKind.String);
}
[ComUnregisterFunction]
public
static
void
UnregisterFunction(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();
}
#endregion
}
8、我安装的是Excel x64,需要手动注册自定义公式的程序集,为此在项目属性中的Build Events中写入批处理脚本来自动注册:
%windir%\Microsoft.NET\Framework64\v4.0.30319\regasm /codebase "$(TargetPath)"
这样在每次编译成功后就会自动注册该自定义公式。
9、在生成管理器中配置为 x64:
10、在Ribbon项目中添加调用自定义公式的代码:
View Code
using
Microsoft.Office.Tools.Ribbon;
namespace
ExcelAddIn
{
public
partial
class
RibbonDemo
{
private
void
RibbonDemo_Load(
object
sender, RibbonUIEventArgs e)
{
}
private
void
btnAdd_Click(
object
sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.Application.ActiveCell.Formula
=
"
=Add()
"
;
}
private
void
btnSubtract_Click(
object
sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.Application.ActiveCell.Formula
=
"
=Subtract()
"
;
}
private
void
btnMultiply_Click(
object
sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.Application.ActiveCell.Formula
=
"
=Multiply()
"
;
}
private
void
btnDivide_Click(
object
sender, RibbonControlEventArgs e)
{
Globals.ThisAddIn.Application.ActiveCell.Formula
=
"
=Divide()
"
;
}
}
11、修改Ribbon项目属性,将 Excel设置为启动的扩展程序:
12、编译、运行,会调用Excel来打开,自动加载我们的插件ExcelAddIn:
13、激活自定义公式:
在【Developer】选项卡中点击【Add-Ins】,再点击【Automation】找到我们编写的自定义公式,【OK】。
14、此时在Excel中就可以使用我们的公式了,EnjoyJ
小结:
本次把自定义Ribbon与自定义公式结合起来使用,具体细节可以参考源代码,在我之前的VSTO 系列文章中也有介绍。
需要注意的是这种方法只适用于Excel 2007、2010,2003不支持,关于Excel 2003的自定义菜单及自定义公式解决方案后面再介绍。
此外,只有Excel 2010 x64需要用批处理脚本来注册自定义公式,Excel 2010 x86不需要,会自动注册。