VBA编写Ribbon Custom UI编辑器03——认识Ribbon的xml
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui">
<ribbon>
<tabs>
<tab id="TabID" label="tabName" insertAfterMso="TabDeveloper">
<group id="GroupID" label="GroupName">
<button id="Button1" label="buttonname " size="large" onAction="Macro" imageMso="HappyFace"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>
这是一个很简单的Ribbon customUI.xml代码,能实现的菜单如下:
- 一个新的菜单tab,名称为tabName
- 一个组group,名称为GroupName
- 一个按钮button,名称为buttonname
制作自定义的Ribbon菜单,一般主要用到的就是上面3个东西。
当然我们关注的不是说主要用哪几个东西,而是Ribbon xml的编写格式,这个格式的文本如何转换为一个二维数组,然后输出到Excel表格:
输出到了Excel表格,才能在Excel里去编辑它。
编辑好之后,还要考虑如果将Excel表格上的内容,转换为Ribbon xml的编写格式,重新写入到Office文件中。
01
解析功能
元素:紧跟在『<』后面的customUI、ribbon、tabs、group、button,这些被称作xml的元素,xml这种语言没有限制元素的名称,但是Ribbon中还是有限制的,针对某个版本来说,肯定是固定的。
但是写一个程序,必须要考虑到以后,一旦Ribbon的xml语言升级更新了,支持的元素名称多了,程序还要保证能够正确运行,所以不能在程序里固定写死元素。
这样不管Ribbon的xml有什么更新,只要它是满足xml语言的编写规范,这个解析的功能都能够将相应的文本输出到Excel中去。
<…………>:一对括号内的内容,对应的也就是要输出到Excel单元格中的一行内容。
属性:括号内除去元素之外,剩下的都是xx="yy"这种形式的东西,这个称作元素的属性,xx是属性的名称,yy是属性的值。
对应的就是属性名称输出到Excel单元格的第一行,属性的值输出到元素所在行、属性所在列的单元格。
02
还原功能
还原功能就是将Excel单元格中的内容,转换为xml的文本。
HasChild这个属性并不是Ribbon的xml语言内容,是为了方便还原的时候,正确还原那些允许包含子控件的元素,这些元素的结束标记都是单独的,如例子中的:
</group>
</tab>
</tabs>
</ribbon>
</customUI>
而其他控件的格式是这样的<…………/>
这个还原功能应该就比较简单了,只要循环每一个行的内容:
- 判断对应列的属性值是否为空,不为空的时候,添加一些固定的文本
- 然后前面添加括号标记<…………>
- 最后再全部连接到一个文本
xml语言的知识建议到网上找些资料先看看,了解一下。本人也基本没使用过xml语言,只是在自定义Excel Ribbon的时候用用,了解的也比较浅,个人觉得下面这个网站讲的还比较浅显易懂:
https://www.w3school.com.cn/xml/index.asp
- API网关Ocelot 使用Polly 处理部分失败问题
- 使用GoogleAPI加载各种js框架
- Docker容器学习梳理--日常操作总结
- 马化腾:通向互联网未来的七个路标
- jQuery扩展以及gzip压缩测试
- python2.6升级到3.3.0 的操作记录
- 由javascript中"匿名函数调用写法"引出的一些东东
- javascript中定义私有方法(private method)
- python升级后带来的几个小问题
- 分布式监控系统Zabbix-3.0.3-完整安装记录(1)
- centos6.8下安装部署LNMP-(nginx1.8.0+php5.6.10+mysql5.6.12)
- IE7下当position:fixed遇到text-align:center
- 数组-在Shell脚本中的基本使用介绍
- .Net Core下通过Proxy 模式 使用 WCF
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 花十分钟的时间武装你的代码库
- 对HTML-input的一些思考和理解
- 【投稿】刀哥:Rust学习笔记 1
- 【Rust日报】2020-08-13 关于群集(Bevy)引擎ECS框架中system的语法糖是怎么实现的
- 最新情报:所有的递归都可以改写成非递归?
- 算法篇:树之转换为二叉搜索树
- 算法篇:树之倒数k个节点
- 揭开链表的真面目
- Coder,我怀疑你并不会枚举
- 掌握坐标轴的log转换
- 连通域的原理与Python实现
- 涨见识!Java String转int还有这种写法
- RTSP拉流协议视频平台EasyNVR能够接入多少路视频直播流?
- 安装allure后执行命令后报错 INTERNALERROR> AttributeError: module 'pytest' has no attribute 'allure'
- 太好玩了,爬虫、部署API、加小程序,一条龙玩转知乎热榜