OFFICE2007之后使用了OpenXml标准(伟大的改变),定制文本级的Ribbon可以通过修改压缩包内的xml文件来实现。

先学习一下VBA中操作XML的方法

先引用Microsoft XML V6.0,对应的文件是msxml6.dll。前期绑定,方便使用智能提示。

一、DOM方式创建一个XML文件:内容是自定义Ribbon的一个简单框架。文件保存在桌面。

 Sub CreateXmlFile()

    '创建文档对象模型
Dim xmldoc As New DOMDocument '创建根节点,XML文档有且必须仅有一个根节点。
Dim root As IXMLDOMElement
'http://schemas.microsoft.com/office/2006/01/customui 2007版本使用的命名空间
'http://schemas.microsoft.com/office/2009/07/customui 2010版本使用的命名空间
Set root = xmldoc.createElement("customUI")
root.setAttribute "xmlns", "http://schemas.microsoft.com/office/2009/07/customui"
Set xmldoc.DocumentElement = root '指定根节点 'ribbon元素
Dim xmlribbon As IXMLDOMElement
Set xmlribbon = xmldoc.createElement("ribbon")
root.appendChild xmlribbon 'tabs元素
Dim xmltabs As IXMLDOMElement
Set xmltabs = xmldoc.createElement("tabs")
xmlribbon.appendChild xmltabs 'tab元素
Dim xmltab As IXMLDOMElement
Set xmltab = xmldoc.createElement("tab")
xmltab.setAttribute "id", "CustomTab"
xmltab.setAttribute "label", "自定义标签"
xmltabs.appendChild xmltab 'group元素
Dim xmlgroup As IXMLDOMElement
Set xmlgroup = xmldoc.createElement("group")
xmlgroup.setAttribute "id", "CustomGroup"
xmlgroup.setAttribute "label", "自定义分组"
xmltab.appendChild xmlgroup 'button元素,并设置button的属性
Dim xmlbutton As IXMLDOMElement
Set xmlbutton = xmldoc.createElement("button")
xmlbutton.setAttribute "id", "btn"
xmlbutton.setAttribute "label", "插入公司名称"
xmlbutton.setAttribute "size", "large"
xmlbutton.setAttribute "onAction", "InsertCompanyName"
xmlgroup.appendChild xmlbutton '文件保存到桌面
xmldoc.Save ("C:\Users\stone\Desktop\1.xml")
End Sub

 下面是创建出来xml文件内容。创建出的文件标签不能自动换行。只好手工排版。 

 <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
<tab id="CustomTab" label="自定义标签">
<group id="CustomGroup" label="自定义分组">
<button id="btn" label="插入公司名称" size="large" onAction="InsertCompanyName"/>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

二、对已有的XML文件添加新的元素:给group添加一个menu元素,menu元素下添加两个button子元素

 Sub AppendXmlFile()

     Dim xmldoc As New DOMDocument

     Dim b As Boolean
'加载xml文件,成功返回true
b = xmldoc.Load("C:\Users\stone\Desktop\1.xml")
If Not b Then Exit Sub ' Dim xmlgroups As IXMLDOMNodeList
' Dim xmlgroup As IXMLDOMElement
' Set xmlgroups = xmldoc.getElementsByTagName("group") '所有的group元素,返回一个集合
' Set xmlgroup = xmlgroups(0) '取集合中第一个group元素 Dim xmlgroup As IXMLDOMNode
'Xpath 选取第一个group节点
Set xmlgroup = xmldoc.SelectSingleNode("//tab[@id='CustomTab']/group[0]") 'menu元素
'为了避免产生xmlns="",要添加的节点的namespaceURI需要和父节点一致。下同
Dim xmlmenu As IXMLDOMElement
Set xmlmenu = xmldoc.createNode(NODE_ELEMENT, "menu", xmlgroup.NamespaceURI)
xmlmenu.setAttribute "id", "CustomMenu"
xmlgroup.appendChild xmlmenu 'button元素
Dim xmlbutton1 As IXMLDOMElement
Set xmlbutton1 = xmldoc.createNode(NODE_ELEMENT, "button", xmlmenu.NamespaceURI)
xmlbutton1.setAttribute "id", "btn1"
xmlbutton1.setAttribute "label", "按钮一" Dim xmlbutton2 As IXMLDOMElement
Set xmlbutton2 = xmldoc.createNode(NODE_ELEMENT, "button", xmlmenu.NamespaceURI)
xmlbutton2.setAttribute "id", "btn2"
xmlbutton2.setAttribute "label", "按钮二" xmlmenu.appendChild xmlbutton1
xmlmenu.appendChild xmlbutton2 Debug.Print xmldoc.XML
xmldoc.Save ("C:\Users\stone\Desktop\1.xml") End Sub

下面是添加新节点后的XML文件内容

 <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
<ribbon>
<tabs>
<tab id="CustomTab" label="自定义标签">
<group id="CustomGroup" label="自定义分组">
<button id="btn" label="插入公司名称" size="large" onAction="InsertCompanyName"/>
<menu id="CustomMenu">
<button id="btn1" label="按钮一"/>
<button id="btn2" label="按钮二"/>
</menu>
</group>
</tab>
</tabs>
</ribbon>
</customUI>

 一个小知识点:

创建子节点时,如果没有指名namespaceURI,在appendchild后,子节点带一个xmlns=""的属性。如果创建子节点时指定namespaceURI等于父节点的URI可以屏蔽这个麻烦,就不会生成xmlns=""了。

DOMDocument的两个方法:

Function selectNodes(queryString As String) As IXMLDOMNodeList

Function selectSingleNode(queryString As String) As IXMLDOMNode

queryString是一个Xpath表达式。

Xpath语法参考W3C网站:http://www.w3school.com.cn/xpath/xpath_syntax.asp

VBA中操作XML的更多相关文章

  1. VC++中操作XML(MFC、SDK)转

    [转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++ ...

  2. 数据库中操作XML(openXML)

    最近公司项目需要在数据库中操作XML,因此系统的学习了一下 一.openxml的格式 OPENXML( idoc int [ in] , XPathnvarchar [ in ] , [ flags ...

  3. C#.Net中操作XML方法一

    我们知道XML是一种可标记性的语言,用来标记数据.定义数据类型,是一种执行用户对自己的标记语言进行定义的源语言.由于结构好.而且easy理解,就好比一棵树,层次关系分明,因此也经常把一些数据存储到XM ...

  4. 第12章 在.NET中操作XML

    12.1 XML概述 12.1.1 为什么要有XML 12.1.2 XML文档结构 (1)文档声明 <?xml version="1.0"encoding="UTF ...

  5. [转]VC++中操作XML(MFC、SDK)

    XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作XML有两个库可以用:MSXML和Xml ...

  6. 《SeleniumBasic 3.141.0.0 - 在VBA中操作浏览器》系列文章之一:SeleniumBasic的下载

    Selenium是一种非常流行的浏览器和网页自动化技术,开发人员可以使用C#.Java.Python等语言来操作Chrome.Firefox等浏览器. VBA语言可以直接操作访问Microsoft I ...

  7. C#中操作xml文件(插入节点、修改、删除)

    已知有一个xml文件(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <b ...

  8. Flex中操作XML的E4X方法

    用于处理 XML 的 E4X 方法 Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本   ECMAScript for XML 规范定义了一组用于使用 XML 数据的类 ...

  9. Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)

    1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...

随机推荐

  1. hibernate笔记03

  2. 数据库性能优化:SQL索引

    SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引 ...

  3. 【和小强学移动app测试2】移动终端app测试点归纳(持续更新)

      以下所有测试最后必须在真机上完整的执行 1.安装.卸载测试 在真机上的以及通过91等第三方的安装与卸载 安装在手机上还是sd卡上 2.启动app测试 3.升级测试 数字签名.升级覆盖安装.下载后手 ...

  4. 编写更少bug的程序的六条准则

          如何编写更少bug的程序?  尽可能避免常见的程序错误.              沟通设计先行 + 编写可复用代码 + 做得更多 + 做的更少 + 创造“编程心流”+ 严格的程序测试   ...

  5. resultMap / resultType

    ===================resultMap:实体类的属性和通过resultMap映射后的property属性一致 <resultMap id="workerSelect& ...

  6. 加载执行预编译的Sql :prepareStatement

    1.获得连接:Connection con = null; con = DBUtil.getConnection(); 2.写sql语句:String sql=""; 3.用连接加 ...

  7. Java简单数据类型转换

      1. Integer<---String   (1) Integer x = new Integer(Integer.parseInt(String)); 2. Integer<--- ...

  8. iptables的四表五链

    iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables.真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构. iptables包含4个表, ...

  9. hibernate核心接口,和扩展接口。回顾笔记,以前没记,现在补上,纯手工敲的。

    hibernate核心接口: 所有的hibernate应用都会访问hibernate的5个核心接口 1,Configuration接口 Configuration用于配置并且根启动Hibernate. ...

  10. tcpproxy:基于 Swoole 实现的 TCP 数据包转发工具的方法

    假设我们希望有一台机器A(ip 192.168.1.101)要开放端口6379给用户访问,但可能实际情况是用户无法直接访问到A(ip 192.168.1.101), 但却有一台机器B(ip 192.1 ...