博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
VSTO 学习笔记(十二)自定义公式与Ribbon
阅读量:6800 次
发布时间:2019-06-26

本文共 2978 字,大约阅读时间需要 9 分钟。

原文:

这几天工作中在开发一个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注册、反注册函数:

ExpandedBlockStart.gif
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项目中添加调用自定义公式的代码:

ExpandedBlockStart.gif
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不需要,会自动注册。

转载地址:http://mnuwl.baihongyu.com/

你可能感兴趣的文章
NUnit Console Command Line
查看>>
读写分离主从复制集群分库分表的总体理解
查看>>
编译器指示语句
查看>>
PLSQL中显示Cursor、隐示Cursor、动态Ref Cursor差别
查看>>
《算法导论》读书笔记(三)
查看>>
react-redux
查看>>
Java NIO(一)I/O模型概述
查看>>
【转】对博士学位说永别
查看>>
SQL Server等待事件—RESOURCE_SEMAPHORE_QUERY_COMPILE
查看>>
权限模型
查看>>
windowns 2008(apache2.2.25 x86 openssl0.98y) 升级openssl1.0.1e(为了支持小程序接口TLS1.2)
查看>>
在.NET下如何预防XXE注入攻击
查看>>
HTC T8878刷机手册
查看>>
修改Discuz! X2文章标题字数限制
查看>>
glloader移植到了Android
查看>>
【转载】dotnet 线程同步
查看>>
static_cast与dynamic_cast转换
查看>>
libevent2的hello world程序 —— 字符大写服务器
查看>>
LINQ简记(2):重要概念
查看>>
jQuery 1.6 源码学习(二)——core.js[2]之extend&ready方法
查看>>