XML 資料交換在Office 二次開發中的應用

2021-11-05 10:02:46 字數 3974 閱讀 7549

xml資料交換在office二次開發中的應用

1概述

vba提供了一個基本的程式設計環境和功能強大的介面,如dom(document object model)和sax(****** 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檔案解析成駐留在記憶體的一棵樹。使用平面資料檔案儲存最大優點就是容易實現,無需資料庫系統和儲存管理器。  

圖1 控制元件到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

//標示的文字相同

ifxmldoc.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 所示。