VSTO 学习笔记(十二)自定义公式与Ribbon

简介: 原文:VSTO 学习笔记(十二)自定义公式与Ribbon这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果。这次我们来做一个简单的测试,达到类似的目的。 即在Excel 2010中添加一个Ribbon,包含4个自定义公式:仅仅是示例公式加减乘除。
原文: 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注册、反注册函数:

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

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

目录
相关文章
|
30天前
|
负载均衡 算法 Java
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(四)Ribbon的使用
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(四)Ribbon的使用
23 0
|
4月前
自定义Ribbon规则--客户端写法
自定义Ribbon规则--客户端写法
|
8月前
|
负载均衡 Java 索引
Spring Cloud:自定义 Ribbon 负载均衡策略
Spring Cloud:自定义 Ribbon 负载均衡策略
|
9月前
|
负载均衡 算法 Nacos
Ribbon自定义负载均衡策略
如何Ribbon自定义负载均衡策略
74 0
|
9月前
|
负载均衡 算法 Java
Ribbon 的负载均衡策略和自定义负载均衡
Ribbon 的负载均衡策略和自定义负载均衡
162 0
|
11月前
|
负载均衡 算法 容灾
Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)
Spring Cloud Alibaba - 11 Ribbon 自定义负载均衡策略(同集群优先权重负载均衡算法)
125 0
|
11月前
|
负载均衡 算法 Java
Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)
Spring Cloud Alibaba - 10 Ribbon 自定义负载均衡策略(权重算法)
182 0
|
11月前
|
负载均衡 算法 Java
Spring Cloud Alibaba - 08 Ribbon 两种方式实现细粒度自定义配置控制微服务的负载均衡策略
Spring Cloud Alibaba - 08 Ribbon 两种方式实现细粒度自定义配置控制微服务的负载均衡策略
96 0
|
11月前
|
负载均衡 Java Maven
Spring Cloud【Finchley】-05使用配置文件自定义Ribbon Client
Spring Cloud【Finchley】-05使用配置文件自定义Ribbon Client
67 0
|
负载均衡 网络协议 Java
Spring Cloud 学习笔记04----服务消费者(RestTemplate+Ribbon(客户端负载均衡))
上一篇《Spring Cloud 学习笔记02----服务治理》我们讲到了服务的注册与发现,在微服务框架中,我们将服务拆分成一个个独立部署的子服务,这些服务通过http rest 来通讯的,Spring Cloud有两种服务调用方式,一种是 RestTemplate+Ribbon, 另外一种是Feign 。
127 0
Spring Cloud 学习笔记04----服务消费者(RestTemplate+Ribbon(客户端负载均衡))