实战Excel Add-in的三种玩法
作者:陈希章 发表于 2017年11月26日
前言
这个系列文章应该有一阵子没有更新了,原因是一如既往的多,但是根本所在是我对于某些章节其实还没有完全想好怎么写,尤其是对于Office Add-in这块 —— 到底是要每个都去单独写一遍,还是有其他什么好的写法会对读者更有帮助?正如我在 这篇文章 分享的一些关于写作的个人经验那样,我为此颇费了一些心思琢磨,直到最近才做出了一个选择:我将不拘泥于每个应用都写一次,而是尝试总结一些共性的操作指南。本文将是一个尝试,以我对于Office Add-in开发的了解,Excel所占的比重相对较高(根据不完全统计,在应用商店所有Office Add-in中,Excel占到40%左右),所以我希望用本文的Excel Add-in的实际案例,给广大的Office Add-in开发人员直观地了解三种不同的开发技术是如何过渡和共存的,以帮助大家做出自己的选择。
本文所提到的三种玩法,是指最早的VBA技术,后来的VSTO技术,以及现在更推荐的Web Add-in的技术。如果大家对于这些基本概念以及Office 365的开发还不太熟悉,欢迎阅读我此前写好的 Office 365开发概述和生态环境介绍:上篇,下篇
案例介绍
我一向鼓励在实践中学习。为了演示如何自定义开发,并且比对不同的技术下面实现方式的差异,本文将以下面的一个需求作为案例展开。假设我们需要为Excel增加一项功能,用户点击一个菜单或者按钮后,可以动态生成一些统计数据,并且根据这些数据生成一个柱状图。
VBA —— 一曲肝肠断,天涯何处觅知音
VBA 是我们最早的一个用来扩展Office 应用程序的技术,由于其简单易用且功能强大,在全世界范围内拥有数以亿计的用户。实现上面提到的这样的需求,其实是VBA很擅长的,尤其是数据如果本身就来自于Excel内部的话。
学习VBA的一个最好起点就是用录制宏。以本案例而言,即便你是VBA的新手,也可以尝试一步一步地输入数据并且生成图表,然后将生成的代码稍作整理和修改后,可能就是下面这样子的。
完整代码可以通过 https://gist.github.com/chenxizhang/3bc5e940f59f9e30d13cb88e3a6c8a6a 获取,请在Excel的VBA编辑器中,新建一个模块,然后将这个代码复制进去,最后按下F5运行即可看到效果。
VSTO —— 出道即巅峰,从未被超越
VSTO是2005年正式引入的,它带来的好处是可以基于功能强大且已经被证明成功的Microsoft .NET平台进行编程,这意味着你可以使用宇宙最强的Visual Studio进行快速开发,同时使用 .NET Framework 的全部功能,可以访问到任何你想要的资源。VSTO的开发语言有VB.NET和C#两种。
我个人目前用的最多的是C#,以我自己的亲身体会来看,从VBA转到VSTO,短期来说,使用VB.NET可能是最简单的,因为语法绝大部分都是一致的。但长期来看,我还是建议大家学习一下C#这门专门为.NET设计的语言。
Visual Studio 的项目模板非常强大,它会自动生成很多的代码。对于一个VSTO的Add-in来说,我们最常见的做法会为它创建对应的Ribbon工具栏,当用户单击了某个按钮后,再根据当前的上下文进行相关的代码处理。
你可以在Ribbon 的设计器中,添加一个按钮,然后将下面的代码复制到按钮的单击事件中,然后按下F5即可进行调试。
完整代码可以通过https://gist.github.com/chenxizhang/c249740f63edf8c29d18700fb357474d 或者 https://gist.github.com/chenxizhang/e75b849b1d2ef6eab5d742a9c976527d 获取,前者是VB.NET代码,后者是C#代码。
Web Add-in —— 向云而生,机遇和挑战共存
Web Add-in是从Office 2013开始支持的新的开发模式,它具有划时代的意义,主要在于利用业界标准的Web开发技术来做Add-in开发,同时具有跨平台和设备的先天优势,集中化部署也降低了运维的复杂性。
不同于VBA到VSTO的平滑过渡,这个新技术对于传统的VBA和VSTO的开发者来说,最大的挑战在于要学习全新的Web开发的技术。Web Add-in包含但不仅限于下面这些主流技术,请大家有一定的心理准备。
- HTML
- CSS
- Javacript
- Typescript (可选)
- NodeJS (可选)
前面三个是基础,如果有兴趣学习,我推荐一个不错的网站 http://w3school.com.cn/。
后面两个是高级部分,但很可能会成为以后的主流。有兴趣可以通过他们的官方网站进行学习。
我的范例是使用NodeJS来实现的,所以如果要运行范例,则需要先安装好NodeJS的运行环境,请参考 https://nodejs.org/en/ .
在开发工具这个方面,Visual Studio仍然提供了非常好用的模板,但Visual Studio Code可能是一个更好的选择,尤其是你准备学习和使用基于NodeJS来开发Office Add-in的话。
一下子讲了这么多,是不是已经有点头大了?一个好消息是,我们现在有一个有意思的小插件—— Script lab —— 可以在不离开Excel界面的情况下,快速开始学习Web Add-in的开发。这个插件本身就是一个非常典型的Add-in的范例,是由微软内部开发的,它提供了很多样例代码,可以帮助开发者熟悉全新的基于javascript的对象模型。
只要你拥有Office 365的账号,你就可以免费使用这个插件。具体的操作方式是在顶部的Ribbon工具栏中,找到“Insert”这个选项卡,然后单击里面的“Store”这个按钮,搜索Script lab即可进行安装。
安装成功后,顶部的Ribbon工具栏会多出来一个选项卡“Script Lab”,点击“Code”按钮,然后找到Report generation 这个Sample,如下图所示
你现在无需做任何代码的修改,直接Run就可以看到上图的效果了。
请注意,官方提供的这个Report Generation的Sample其实有一个小的代码问题,它在设置图表的数据源时没有把标题行包括进去,我已经修改了这个Sample,有需要可以通过 https://gist.github.com/chenxizhang/cebfde8cf08c55d54d5cdb336b166cee 查看,并且导入到你的Sample库中去。
关于在Visual Studio Code中如何开发和测试Office Add-in,微软官方也有一篇文章可以参考:https://code.visualstudio.com/docs/other/office 。我这里要告诉大家的好消息是,你用Script lab运行成功的代码,几乎可以原封不动地复制粘贴到Visual Studio Code中去,做成一个真正的Add-in,并且通过你的渠道分发出去。(这些内容我后续还会专门的文章展开讲解)。
结语
虽然我做这方面研究已经有相当长时间了,但真正这三个技术放一起对比讨论,却是直到昨天我在与大中华区两个影响力最大的Office中文技术社区(ExcelHome和ExcelPX)的专家朋友们聚会讨论时才首次展示。我用这个作为例子的主要目的,是希望让大家看到技术的发展路线,理解为什么要这么变化,同时并且通过实例让大家更加有信心,虽然学习新东西会遇到一些挑战的,但大家也能清楚地看到,代码的结构、逻辑其实是相通的。说到底,这也是一个程序员的基本素养 —— 我们从来不会停止探索,而因为我们有编程的思维,所以我们毫无畏惧。
关于本次活动,我分享的资料,如有兴趣,也可以通过 这里 下载到。
实战Excel Add-in的三种玩法的更多相关文章
- squid+stunnel+用户密码认证的三种玩法
没办法,应用越来越深入,就会越来越多要求. squid+stunnel+用户密码认证的场景至少以下三个,我会遇到. 1,标准玩法 在服务器上建一个SQUID,加密码认证,然后,其它人通过它上网.(不要 ...
- 历数依赖注入的N种玩法
历数依赖注入的N种玩法 在对ASP.NET Core管道中关于依赖注入的两个核心对象(ServiceCollection和ServiceProvider)有了足够的认识之后,我们将关注的目光转移到编程 ...
- 【Microsoft Azure 的1024种玩法】四. 利用Azure Virtual machines 打造个人专属云盘,速度吊打某云盘
[简介] 1.Azure Virtual machines是Azure 提供的多种可缩放按需分配计算资源之一,Nextcloud是一款开源免费的私有云存储网盘项目,可以让你快速便捷地搭建一套属于自己或 ...
- 【Microsoft Azure 的1024种玩法】五、基于Azure Cloud Shell 一站式创建Linux VM
[文章简介] Azure Cloud Shell 是一个用于管理 Azure 资源的.可通过浏览器访问的交互式经验证 shell. 它使用户能够灵活选择最适合自己工作方式的 shell 体验,无论是 ...
- 【Microsoft Azure 的1024种玩法】六、使用Azure Cloud Shell对Linux VirtualMachines 进行生命周期管理
[文章简介] Azure Cloud Shell 是一个用于管理 Azure 资源的.可通过浏览器访问的交互式经验证 shell. 它使用户能够灵活选择最适合自己工作方式的 shell 体验,本篇文章 ...
- 【Microsoft Azure 的1024种玩法】八. 基于Azure云端轻松打造一款好用的私有云笔记
[简介] Leanote一款开源云笔记软件,它使用Go的Web框架revel和MongoDB开发完成的,其是目前为止发现的最有bigger的云笔记,它支持markdown输入,代码高亮,多人协作,笔记 ...
- 【Microsoft Azure 的1024种玩法】七.Azure云端搭建部署属于自己的维基百科
[简介] MediaWiki是全球最著名的开源wiki程序,运行于PHP+MySQL环境.MediaWiki从2002年2月25日被作为维基百科全书的系统软件,并有大量其他应用实例.MediaWiki ...
- 【第1期】腾讯云的1001种玩法征集,Ipad mini和Kindle 等你拿!(文章评审中)
版权声明:本文由阁主的小跟班原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/695994001482226944 来源:腾云 ...
- 【腾讯云的1001种玩法】几种在腾讯云建立WordPress的方法(Linux)(二)
版权声明:本文由张宁原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/126547001488207964 来源:腾云阁 ht ...
随机推荐
- KDevelop使用笔记【中文】
师从官方文档: https://userbase.kde.org/KDevelop4/Manual https://docs.kde.org/trunk5/en/extragear-kdevelop/ ...
- 带你领会 线性代数 微积分的本质 3blue1brown 动画效果帅出天际
前段时间在 哔哩哔哩 上偶然发现了 3blue1brown 精美的动画,配上生动的讲解,非常适合帮助建立数学的形象思维 其中两大系列,非常值得反复观看: 线性代数的本质(Essence of line ...
- Linux入门(12)——解决双系统下Ubuntu16.04不能访问Windows分区
解决办法一: 进入windows系统,关闭快速启动,关机. 解决办法二: 如果办法一不能解决问题,用这个办法. 查看盘符: sudo fdisk -l 需要在查看盘符后记下目标盘符的数字,比如想解除C ...
- Taffy自动化测试框架简介
Taffy Taffy是基于nosetests的自动化测试框架. Taffy主要用来测试后台服务(包括且不限于Http, Dubbo/hessian, Webservice, Socket等类型接口) ...
- 【Java学习笔记之三十四】超详解Java多线程基础
前言 多线程并发编程是Java编程中重要的一块内容,也是面试重点覆盖区域,所以学好多线程并发编程对我们来说极其重要,下面跟我一起开启本次的学习之旅吧. 正文 线程与进程 1 线程:进程中负责程序执行的 ...
- Spring bean 生命周期验证
一.从源码注释看bean生命周期 从JDK源码上看,BeanFactory实现类需要支持Bean的完整生命周期,完整的初始化方法及其标准顺序(格式:接口 方法)为: 1.BeanNameAware s ...
- 利用cookies+requests包登陆微博,使用xpath抓取目标用户的用户信息、微博以及对应评论
本文目的:介绍如何抓取微博内容,利用requests包+cookies实现登陆微博,lxml包的xpath语法解析网页,抓取目标内容. 所需python包:requests.lxml 皆使用pip安装 ...
- 项目swift的一些问题
在用swift做项目的时候,总会把之前oc的思想转过来. 1. 对Alamofire的再次封装,之前使用AFNetwork进行了在次封装,这样做的好处就是可以用一个全局的类来管理全部的网络请求,这样就 ...
- 微信公众号开发(十二)OAuth2.0网页授权
OAuth允许用户提供一个令牌,而不是用户名和密码来访问它们存放在特定服务器上的数据,每一个令牌授权一个特定的网站在特定时段内访问特定的资源. 授权过程如下: 1.引导用户进入授权页面同意授权,获取c ...
- django 实现登录时候输入密码错误5次锁定用户十分钟
在学习django的时候,想要实现登录失败后,进行用户锁定,切记录锁定时间,在网上找了很多资料,但是都感觉不是那么靠谱, 于是乎,我开始了我的设计,其实我一开始想要借助redis呢,但是想要先开发一个 ...