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

时间:2022-12-12 10:42:39

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

这几天工作中在开发一个Excel插件,包含自定义公式,根据条件从数据库中查询结果。这次我们来做一个简单的测试,达到类似的目的。

即在Excel 2010中添加一个Ribbon,包含4个自定义公式:仅仅是示例公式加减乘除。

最终效果:

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

测试代码下载

1、解决方案包含两个项目:

ExcelAddIn:Excel 插件

ExcelUDF:Excel 自定义公式

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

2、首先创建一个Excel 2010 Add-in项目:

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

3、添加一个可视化Ribbon:

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

4、在Ribbon的设计视图中,设置下RibbonTab的属性:

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

有个ControlIdType属性,当设置为Custom时,此Ribbon显示为Office中独立的一项;当设置为Office时,此Ribbon作为Add-In中的一项出现。

5、在MyRibbon中添加一个Menu,在其中放置四个按钮:

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

6、创建一个类库项目:

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

7、编写加减乘除四个函数和COM注册、反注册函数:

VSTO 学习笔记(十二)自定义公式与RibbonVSTO 学习笔记(十二)自定义公式与Ribbon 
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)"

这样在每次编译成功后就会自动注册该自定义公式。

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

9、在生成管理器中配置为 x64:

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

10、在Ribbon项目中添加调用自定义公式的代码:

VSTO 学习笔记(十二)自定义公式与RibbonVSTO 学习笔记(十二)自定义公式与Ribbon 
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设置为启动的扩展程序:

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

12、编译、运行,会调用Excel来打开,自动加载我们的插件ExcelAddIn:

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

13、激活自定义公式:

在【Developer】选项卡中点击【Add-Ins】,再点击【Automation】找到我们编写的自定义公式,【OK】。

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

14、此时在Excel中就可以使用我们的公式了,EnjoyJ

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

小结:

本次把自定义Ribbon与自定义公式结合起来使用,具体细节可以参考源代码,在我之前的VSTO 系列文章中也有介绍。

需要注意的是这种方法只适用于Excel 2007、2010,2003不支持,关于Excel 2003的自定义菜单及自定义公式解决方案后面再介绍。

此外,只有Excel 2010 x64需要用批处理脚本来注册自定义公式,Excel 2010 x86不需要,会自动注册。

VSTO 学习笔记(十二)自定义公式与Ribbon的更多相关文章

  1. VSTO学习笔记(二)Excel对象模型

    原文:VSTO学习笔记(二)Excel对象模型 上一次主要学习了VSTO的发展历史及其历代版本的新特性,概述了VSTO对开发人员的帮助和效率提升.从这次开始,将从VSTO 4.0开始,逐一探讨VSTO ...

  2. python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL

    python3.4学习笔记(十二) python正则表达式的使用,使用pyspider匹配输出带.html结尾的URL实战例子:使用pyspider匹配输出带.html结尾的URL:@config(a ...

  3. Go语言学习笔记十二: 范围(Range)

    Go语言学习笔记十二: 范围(Range) rang这个关键字主要用来遍历数组,切片,通道或Map.在数组和切片中返回索引值,在Map中返回key. 这个特别像python的方式.不过写法上比较怪异使 ...

  4. java jvm学习笔记十二(访问控制器的栈校验机制)

    欢迎装载请说明出处:http://blog.csdn.net/yfqnihao 本节源码:http://download.csdn.net/detail/yfqnihao/4863854 这一节,我们 ...

  5. (C/C++学习笔记) 十二. 指针

    十二. 指针 ● 基本概念 位系统下为4字节(8位十六进制数),在64位系统下为8字节(16位十六进制数) 进制表示的, 内存地址不占用内存空间 指针本身是一种数据类型, 它可以指向int, char ...

  6. Python学习笔记(十二)—Python3中pip包管理工具的安装【转】

    本文转载自:https://blog.csdn.net/sinat_14849739/article/details/79101529 版权声明:本文为博主原创文章,未经博主允许不得转载. https ...

  7. Oracle学习笔记(十二)

    十三.存储过程和存储函数1.掌握存储过程(相当于建立一个函数或者方法体,然后通过外部对其调用) 指存储在数据库*所有程序调用的子程序叫做存储过程或存储函数. 相同点: 完成特定功能的程序 区别: 是 ...

  8. MYSQL进阶学习笔记十二:MySQL 表分区!(视频序号:进阶_29,30)

    知识点十三:MySQL 表的分区(29) 一.什么要采用分区: 分区的定义: 当数据量过大的时候(通常是指百万级或千万级数据的时候),这时候需要将一张表划分几张表存储.一些查询可以得到极大的优化,这主 ...

  9. ROS学习笔记十二:使用gazebo在ROS中仿真

    想要在ROS系统中对我们的机器人进行仿真,需要使用gazebo. gazebo是一种适用于复杂室内多机器人和室外环境的仿真环境.它能够在三维环境中对多个机器人.传感器及物体进行仿真,产生实际传感器反馈 ...

  10. odoo10学习笔记十二:web controller

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189332.html 一:路由 odoo.http.route(route=None, **kw) 装饰器 ...

随机推荐

  1. Android 急速发布项目到 JitPack

    转载请标明出处: http://www.cnblogs.com/zhaoyanjun/p/5942616.html 出自[赵彦军博客] 2016/10/09 前言:以前写过一篇 Android stu ...

  2. 名词含义阅读 todolist

    1.node webkit 2.C#设计模式 3.算法导论 4.SQLSERVER RowNum() 5.图片文字识别 6.tuple 7.yield 8.Web语义化 (多用 p ul ol li ...

  3. Angular $watch

    如果想在某个属性发生变化的时候执行某些操作,那么scope.$watch是最佳选择 https://docs.angularjs.org/api/ng/type/$rootScope.Scope#$w ...

  4. 【leetcode】Palindrome Partitioning II(hard) ☆

    Given a string s, partition s such that every substring of the partition is a palindrome. Return the ...

  5. LeetCode:Text Justification

    题目链接 Given an array of words and a length L, format the text such that each line has exactly L chara ...

  6. ASP.NET在IE9,IE10,IE11中Form表单身份验证失效问题解决方法

    已经研究出解决方案. IE9:在web.config中的forms中增加name=".xCookie"属性即可. IE10或IE11: 在web.config中的forms中增加c ...

  7. 简单了解ddos攻击

    1.一种为流量攻击,主要是针对网络带宽的攻击,即大量攻击包导致网络带宽被阻塞,合法网络包被虚假的攻击包淹没而无法到达主机: 2.另一种为资源耗尽攻击,主要是针对服务器主机的攻击,即通过大量攻击包导致主 ...

  8. POJ 3461 Oulipo(字符串匹配,KMP算法)

    题意:给出几组数据,每组有字符串W和T,问你W在T中出现几次. 思路:字符串长度很大,用KMP算法. 一开始写的是:调用KMP算法查找W在T中是否匹配,若匹配,则个数+1.则接下来T的索引移动相应的距 ...

  9. SQL 远程过程调用失败【0x800706be】或正在关闭 【0x80041033】解决方法

    在SQL Server 配置管理器中出现[远程过程调用失败.[0x800706be]]或者[正在关闭 [0x80041033]]错误,如图所示 上网查找发现时SQL2008与VS2012或VS2013 ...

  10. jquery监听video标签视频播放暂停状态

    由于jquery中没有video的paly,pause方法,所以在使用jquery来控制视频的播放的播放状态时会出现问题 之前的代码: let $video = $('#video'); $('.pl ...