VBA中操作XML
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的更多相关文章
- VC++中操作XML(MFC、SDK)转
[转]VC++中操作XML(MFC.SDK) XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++ ...
- 数据库中操作XML(openXML)
最近公司项目需要在数据库中操作XML,因此系统的学习了一下 一.openxml的格式 OPENXML( idoc int [ in] , XPathnvarchar [ in ] , [ flags ...
- C#.Net中操作XML方法一
我们知道XML是一种可标记性的语言,用来标记数据.定义数据类型,是一种执行用户对自己的标记语言进行定义的源语言.由于结构好.而且easy理解,就好比一棵树,层次关系分明,因此也经常把一些数据存储到XM ...
- 第12章 在.NET中操作XML
12.1 XML概述 12.1.1 为什么要有XML 12.1.2 XML文档结构 (1)文档声明 <?xml version="1.0"encoding="UTF ...
- [转]VC++中操作XML(MFC、SDK)
XML在Win32程序方面应该没有在Web方面应用得多,很多Win32程序也只是用XML来存存配置信息而已,而且没有足够的好处的话还不如用ini.VC++里操作XML有两个库可以用:MSXML和Xml ...
- 《SeleniumBasic 3.141.0.0 - 在VBA中操作浏览器》系列文章之一:SeleniumBasic的下载
Selenium是一种非常流行的浏览器和网页自动化技术,开发人员可以使用C#.Java.Python等语言来操作Chrome.Firefox等浏览器. VBA语言可以直接操作访问Microsoft I ...
- C#中操作xml文件(插入节点、修改、删除)
已知有一个xml文件(bookstore.xml)如下: <?xml version="1.0" encoding="gb2312"?> <b ...
- Flex中操作XML的E4X方法
用于处理 XML 的 E4X 方法 Flash Player 9 和更高版本,Adobe AIR 1.0 和更高版本 ECMAScript for XML 规范定义了一组用于使用 XML 数据的类 ...
- Android(java)学习笔记187:Android中操作XML数据(使用Pull解析器)
1. Pull解析器的运行方式与 SAX 解析器相似.它提供了类似的事件,如:开始元素和结束元素事件,使用parser.next()可以进入下一个元素并触发相应事件.跟SAX不同的是, Pull解析器 ...
随机推荐
- mysql去除重复数据
select可以取别名,delete不能. 1.使用mysql进行delete from操作时,若子查询的 FROM 字句和更新/删除对象使用同一张表,会出现错误. mysql> DELETE ...
- 转:Eclipse常用开发插件
以下是我整理的自己开发过程中的常用Eclipse插件,按字母排序: (1) AmaterasUML 介绍:Eclipse的UML插件,支持UML活动图,class图,sequen ...
- NOIP201208同余方程
NOIP201208同余方程 描述 求关于x的同余方程ax ≡ 1 (mod b)的最小正整数解. 格式 输入格式 输入只有一行,包含两个正整数a, b,用一个空格隔开. 输出格式 输出只有一行,包含 ...
- 利用foreach对页面控件的遍历 及三目运算符的使用
1.利用foreach对页面控件的遍历 及三目运算符的使用 利用div将一组CheckBox放在一起用于遍历 <body> <form id="form1" ru ...
- Android压力测试快速入门教程(图解)——Monkey工具
文章目录: 一.Monkey简介 二.Monkey的基本用法 三.Monkey测试示例图解 四.Monkey命令参数介绍 五.Monkey log分析 一.Monkey简介 Monkey:Androi ...
- Android判断网络状态
package com.ch.services; import com.ch.utils.NetWorkUtils; import android.app.Service; import androi ...
- 鸟哥的linux私房菜学习记录之开机流程、模块管理与Loader
- 161012、JAVA读写文件,如何避免中文乱码
1.JAVA读取文件,避免中文乱码. /** * 读取文件内容 * * @param filePathAndName * String 如 c:\\1.txt 绝对路径 * @return boole ...
- Failed to read auto-increment value from storage engine, Error Number: 1467
重设auto_increment:ALTER TABLE tableName auto_increment=number
- 精通 JS正则表达式
一.正则表达式可以: 测试字符串的某个模式.例如,可以对一个输入字符串进行测试,看在该字符串是否存在一个电话号码模式或一个信用卡号码模式.这称为数据有效性验证 替换文本.可以在文档中使用一个正则表达式 ...