XML 数据交换在Office 二次开发中的应用
1 概述
VBA提供了一个基本的编程环境和功能强大的接口,如DOM(Document Object Model)和SAX(Simple API for XML)实现了对XML 文档中数据的访问和处理。
将Office 控件中的数据保存到XML 文档中,同时完成XML 文档树的创建,实现了访问和处理XML 文档内容和结构;另一方面,XML 文档中保存的数据也用于传递给控件和表格,完成Office 控件的初始化工作以及表格的限项填写、修改和删除等操作,实现了XML 文档与控件、表格之间的数据交换。
2 Office 文档二次开发中的XML 数据交换技术
利用 XML 进行数据交换,主要有DOM 和SAX 这2种完全不同的处理模式。DOM 读取整个文档并且构建相应的节点树,整个文档都保存在内存中,能够更好地实现随机访问文档的所有内容和修改文档结构;SAX逐行读取XML文档,并基于文档内容生成事件,不将文档保存在内存中,该模式常常用于处理大型文档、查找文档中的特定信息以及不需要修改文档结构。
2.1 控件中的数据传递到XML 文件
在用VBA进行Office文档二次开发的时候,常常用到控件工具箱中的控件来获取数据,并且将数据存储在创建的XML文档中。控件中的数据传递给XML文件需要经过数据提取、数据加载和数据存储这3个过程。
(1)数据提取。每个控件都会有它的按钮标识符,使用数组来保存标识符所对应的数据,以便在构建XML文档时方便地提取这些数据。
(2)数据加载。将控件中的数据保存到数组中后,如果已经有一个XML文档,则加载此文档。整个加载过程一般都是通过将文档加载到DOMDocument对象中,该对象实现了将XML文档加载到解析器中,解析器实现了XML文档到解析树的转变过程。接下来就可以使用DOM对象中的一些属性或者方法来对解析树操作。例如,IXMLDOMElement表示XML元素对象,它的方法和属性实现了对XML元素的增加、删除、修改等操作;IXMLDOMNodeList表示节点对象,它实现了对节点列表的访问。
(3)数据存储。完成数据保存后的XML文件需要存储到XML数据文件中,而XML数据文件的存储策略目前主要有以下3种:利用文件系统的平面文件,利用成熟的RD-BMS,利用对象管理器或面向对象数据库管理系统(OOD-BMS)。在这里仅介绍第一第1种存储策略。XML文档在本质上是序列化数据。序列化数据通常采用平面文件的形式,,即将每一个XML文档分别存储在一个文本文件里,,并且将XML文件解析成驻留在内存的一棵树。使用平面数据文件存储最大优点就是容易实现,无需数据库系统和存储管理器。
数据提取的主要代码如下:
Dim a As Integer
'//获取标示为first_tag_name 的XML 文件的节点个数
a=xmldoc.SelectNodes("/Root/"+first_tag_name).Length-1
'//循环遍历
For i = 0 To a
'//判断列表中第i 个节点的首个孩子结点文本是否跟first_num
//标示的文本相同
If
xmldoc.SelectNodes("/Root/"+first_tag_name).Item(i).ChildNodes
(0). text=first_num Then
'//将列表中第i 个项中的第second_num 个孩子节点的内容赋值
//给getDataFromXml
getDataFromXml=xmldoc.SelectNodes("/Root/"+
first_tag_name).Item(i).ChildNodes(second_num).text
Exit Function
End If
Next i
getDataFromXml = ""
数据加载的主要代码如下:
'//获取隐藏XML 文件含有的T_RY_MEMBERS 标签数
Dim elementCount As Integer
elementCount = xmldoc.getElementsByTagName("T_RY_
MEMBERS").Length
'//循环完成后,相当于分配了一个12 行39 列的数组空间,
并根//据XML 文件的内容完成了初始化,其中第一行1 行存放
到的是标签
For i = 1 To elementCount
For j = 0 To 39
ReDim Preserve dataarray(39, i)
'//从申请人表中获取数据,循环遍历节点并且保存到数组中
dataarray(j, i) = getDataFromXml(xmldoc, "T_RY_
MEMBERS", CStr(i + 1), CStr(j))
Next
2.3 Office 文档控件中输入的数据写入到表格
在VBA二次开发过程中,一部分控件的设计是根据表格中需要填写的内容,将表格中的字段与VBA 控件工具箱中各种控件的标识符相关联起来,从而实现对各种控件的数据输入等同于对表格中相对应的表格项的填写。由于控件中内容的输入是比较规范化和科学化的,因而因此对表格的填写也具有这种效果,这种优点很大程度上减少了出错的可能。Word 对象中一些常用的对象有:Range对象,它表示文档中一段指定连续的文本区域;Sections对象,它表示表格所在的段的位置;Tables对象表明该段中此表格是第几张表格;Cell对象可以说明应该填写表格中哪个空格。控件中的数据写入到表格中首先需要获取表格的名称,然后循环遍历表格中的项,将保存在数组中的数据传递给表格中对应的项,最后将数组中获取的数据显示到表格中,完成表格的填写操作。整个过程的主要代码如下:
Dim n As Integer
'//把通过对话框填写的数据保存到word 上
With ThisDocument.Sections(7).Range.Tables(1)
'//UBound(dataarray, 1)返回成员的人数
For n = 1 To UBound(dataarray, 1)
.Cell(n + 3, 1).Range.text = n + 1
For m = 1 To 8
If m = 6 Then
Dim a As String
'//数组中的值赋值给表格第六第6 列中的项,dataarray()
数组//保存了申请者的信息
a = Right(dataarray(n, 5), Len(dataarray(n, 5)) - 5)
.Cell(n + 3, 6).Range.text = a
ElseIf m <> 6 Then
'//填写表格中其余列中的项
.Cell(n + 3, m).Range.text = dataarray(n, m - 1)
'//dataarray[0,n-1] 保存的是标题, dataarray[1,n-1] 保存的是
//第一第1 个成员,不包含成员
End If
Next
Next
3 表格限项填写、修改和检查
表格限项填写是指对表格中的部分信息不需要甚至不能
在表格中直接写入信息,而需要利用按钮控件,将控件中填写的信息传递给表格中对应的项,实现了表格填写的规范化、标准化,避免重复输入数据,提高数据的准确性。在填写过程中对常用的信息可以通过列表的方式显示出来,方便用户正确的地选择,如职位、职称的信息,减少了错误的产生。在填写完内容之后,需要对填写的内容做格式等方面的检查,如检查日期的格式等。
将控件中的数据填写到表格中的主要过程如图 2 所示。
联系客服