來源:ccidnet 編輯:若水 時(shí)間:2008-05-05
收藏:
MYSQL客戶端下載:
Navicat for MySQL簡體中文版V8.1.20本文介紹了Word域與數(shù)據(jù)庫結(jié)合的方法,給用戶提供一個(gè)插入Word域的界面,并把數(shù)據(jù)庫的數(shù)據(jù)填充到Word文件中。
域是Word中最具有實(shí)用價(jià)值的功能之一,它表示文檔中可能發(fā)生變化的數(shù)據(jù)或郵件合并文檔中套用信函、標(biāo)簽中的占位符。Microsoft Word 可以在您使用一些特定命令時(shí)插入域,如"插入"菜單上的"日期和時(shí)間"命令。您也可使用"插入"菜單上的"域"命令手動插入域。事實(shí)上,我們在日常工作中常會脫離Microsoft Word的操作環(huán)境。一般,用戶是先建立好一些Word文件模板,然后利用所提供的應(yīng)用程序功能向Word文件模板中插入域,用該域?qū)?yīng)的值取代域值,這樣就達(dá)到了向Microsoft Word文件中插入數(shù)據(jù)的作用。我們常把數(shù)據(jù)放入數(shù)據(jù)庫中,數(shù)據(jù)庫的內(nèi)容不斷地變化,我們的域值也跟著不斷地變化,取到靈活自動更新的作用,要達(dá)到這方面的功能,就應(yīng)該把數(shù)據(jù)庫與Word域結(jié)合起來。
解決方法
首先要解決這一問題,我們必須先了解Word域有關(guān)的知識:Word域代碼位于花括號或大括號 ( { } )中,域類似于 Microsoft Excel 中的公式:域代碼類似于公式,域結(jié)果(域結(jié)果:當(dāng) Microsoft Word 執(zhí)行域指令時(shí),在文檔中插入的文字或圖形。在打印文檔或隱藏域代碼時(shí),將以域結(jié)果替換域代碼。)類似于公式產(chǎn)生的值??稍谖臋n中切換顯示域代碼及其結(jié)果。正好,數(shù)據(jù)庫的字段名對應(yīng)域代碼,字段值對應(yīng)域值。我們利用VBA編程可以達(dá)到目的。VBA for Word 中有關(guān)域的類型很多,其中Type:=wdFieldAddin是一種關(guān)于字段與字段值對應(yīng)的特殊域,正是借助它的功能解決問題。我們可以這么設(shè)想,用戶先打開Word文件,然后向打開的Word文件中插入域,然后用數(shù)據(jù)庫的數(shù)據(jù)填充。插入域時(shí)有二種可能,一種是單值域,即一個(gè)域代碼對應(yīng)一個(gè)域值(一對一關(guān)系),這種情況的域可以插入任何地方;另一種情況是多值域,即一個(gè)域代碼對應(yīng)多個(gè)域值(一對多關(guān)系)。這種情況的域只能插入表格中,并且當(dāng)表格的行數(shù)比域值少時(shí),要能自動提供增加表格行的功能。
實(shí)例說明
利用Visual Basic。Net編寫通用的類,給用戶提供可視化的編輯界面,用于用戶在Word文件中插入域標(biāo)志。針對Word文件或Excel表格文件,掃描整個(gè)文件,將其中的域標(biāo)志取出來,然后通過從數(shù)據(jù)庫中取出字段所對應(yīng)的值,將值填寫到文件中域?qū)?yīng)的位置。若對應(yīng)位置已有值,則判斷該值與要填寫的值是否相同,若不同則替換之。插入值分為:
A。單純的值,直接使用一個(gè)值替換域。
B。表格中的單元格。若該表格填寫不下,是否增加表格單元?以及與該單元關(guān)聯(lián)的域等。
例如,有二個(gè)Access數(shù)據(jù)庫的表(:表1對應(yīng)單值域,表2對應(yīng)多值域)如下:
表1:工程
工程名稱設(shè)計(jì)階段工程檢索號項(xiàng)目名稱新制字?jǐn)?shù)圖片數(shù)
建模工具學(xué)習(xí)(2)http://www.21cmm.comfw-jm-2002軟件工程專家網(wǎng)6010003
表2:校核
序號校核主要問題執(zhí)行情況
1排列不齊No
2文字錯Yes
3文字錯Yes
4內(nèi)容提要不詳細(xì)No
5文字錯Yes
6數(shù)據(jù)有誤No
利用VBA編寫的一個(gè)通用的處理Word域的程序。開發(fā)步驟如下 :
1.建立項(xiàng)目,向項(xiàng)目中增加處理Word域的類
啟動Visual Studio。NET。在新建項(xiàng)目中選擇Visual Basic項(xiàng)目,在模板中選擇Windows應(yīng)用程序,把工程名更改為WordDoc。
● 向工程中增加名稱為CWordDoc的類。
● 定義的CWordDoc類的屬性。代碼如下:
'定義Word應(yīng)用對象及文檔對象
Private wdApp As New Word..Application()
Private wdDoc As New Word.Document()
'所處理的Word模板文件
Private FileName As String
'域的個(gè)數(shù)及對應(yīng)的數(shù)組
Dim FieldCount As Int16
Dim MyField()
'Word是否已運(yùn)行
Private IsWordRunning As Boolean
'是否已經(jīng)插入了表格行
Private IsInsertRow As Boolean
'Word工具欄對象及菜單欄對象數(shù)組
Dim CommandBarIndex() As Integer
Dim SaveCommandBarMenuIndex() As Integer
● 定義的CWordDoc類的方法。
定義打開Word文件的方法。建立Word應(yīng)用對象和文檔對象,并打開Word文件。設(shè)定Word已經(jīng)運(yùn)行。VBA編程主要是先建立某一個(gè)應(yīng)用程序的對象,然后按需要處理應(yīng)用對象。Word應(yīng)用對象是“Word.Application”,通過CreateObject方法建立之。代碼如下:
Public Sub OpenWordDocument(ByVal FileName As String)
wdApp = CreateObject("Word。Application")
wdApp.Documents。Open(FileName)
wdDoc = wdApp.ActiveDocument
wdDoc.ActiveWindow.DocumentMap = False
wdApp.Visible = True
IsWordRunning = True
End Sub
保存Word文件。 代碼如下:
Public Sub SaveWordDocument()
wdDoc.SaveAs(FileName)
End Sub
定義Word環(huán)境的大小。
Word啟動后一般是全屏幕(最大化),要把用戶操作界面顯示出來,不被Word遮蔽,處理的方法是把用戶界面設(shè)為頂層窗體,也可使用戶界面與Word各自處在自己位置,平行布置。這里是讓用戶界面位于屏幕的最頂上,Word位于用戶界面的下面。因此要重新調(diào)整Word的位置,這需要設(shè)置Word窗體狀態(tài)為普通類型(wdWindowStateNormal)。代碼如下:
Public Sub SetWordSize(ByVal Left As Integer, ByVal top As Integer,
ByVal width As Integer, ByVal height As Integer)
wdApp。WindowState = Word.WdWindowState.wdWindowStateNormal
wdApp。Left = Left
wdApp。Top = top
wdApp。Width = width
wdApp。Height = height
End Sub
這里我們利用Word文檔對象中域?qū)ο蟮腁dd方法向Word文件中插入域。域的Data屬性代表該域的名稱。插入域時(shí)應(yīng)該選取插入點(diǎn)(Selection),即用戶光標(biāo)處位置。如果該位置是單元格且已插入域,應(yīng)該提示是否覆蓋。插入域時(shí)要分析是插入單值域還是多值域。根據(jù)關(guān)鍵字的后綴識別,關(guān)鍵字的最后一個(gè)字符是'F'時(shí)則為多值域。多值域只能插入在表格中。是否是表格以插入點(diǎn)的單元格識別。實(shí)現(xiàn)該功能的代碼如下:
'在文檔中插入域
'KeyWord:域的關(guān)鍵字
Public Function InsertField(ByVal KeyWord As String) As Integer
Dim mySelection As Selection
Dim Code As String
Dim MyField As Field
Dim myRange As Range
wdApp。Selection。Collapse(Direction:=wdCollapseEnd)
mySelection = wdApp。Selection '插入點(diǎn)
If KeyWord。Chars(KeyWord。Length - 1) = "F" Then
If IsCell(mySelection) <> True Then
MsgBox("該位置不是單元格,請選擇單元格", vbOKOnly + vbExclamation)
Exit Function
End If
End If
If IsCell(mySelection) = True Then
If CellFieldCount(mySelection) > 0 Then
If MsgBox("該單元格已有域,是否覆蓋?", vbYesNo) = 6 Then
mySelection.Cells.Item(1).Select()
mySelection.Delete()
Else
Exit Function
End If
End If
End If
MyField = wdDoc.Fields.Add(Range:=mySelection.Range, Type:=wdFieldAddin)
MyField.Data = KeyWord
End Function
我們可以通過選擇點(diǎn)的表格數(shù)判斷插入點(diǎn)的性質(zhì)。表格數(shù)為0,則選擇點(diǎn)不位于單元格中,反則不位于單元格中。
'選擇點(diǎn)(光標(biāo))是否是單元格。
Private Function IsCell(ByVal mySelection As Selection) As Boolean
If mySelection.Tables.Count > 0 Then
Return True
Else
Return False
End If
End Function
'計(jì)算選擇點(diǎn)(光標(biāo))的單元格的域數(shù)
Private Function CellFieldCount(ByVal mySelection As Selection) As Integer
CellFieldCount = mySelection.Cells.Item(1).Range.Fields.Count
End Function
'記錄插入域代碼及關(guān)鍵字。這里主要是調(diào)用上面的InsertField方法。
Public Function InsertFieldByKeyWord(ByVal KeyWord As String) As Integer
Dim ID As Integer
FieldCount = FieldCount + 1
ReDim MyField(FieldCount)
ID = InsertField(KeyWord)
MyField(FieldCount).ID = ID
MyField(FieldCount).KeyWord = KeyWord
End Function
當(dāng)Word文件已經(jīng)插入了域,就要填充域值。填充域值應(yīng)該分為二種情況考慮。一種是單值域,一種是多值域。單值域是一一對應(yīng)關(guān)系,僅取出值域插入到對應(yīng)的位置。實(shí)現(xiàn)的方法是掃描整個(gè)文檔,找出是用戶插入的域(Fields.Type = 81),用域值取代之,這里用到了一個(gè)由關(guān)鍵字得到值的方法GetFieldValues,這個(gè)方法在后面將會講到,對應(yīng)的是數(shù)據(jù)庫的"工程"表。怎樣保證永遠(yuǎn)僅插入一個(gè)值呢?方法是先清除掉原域值和域代碼,再在當(dāng)前插入點(diǎn)插入域代碼和域值。實(shí)現(xiàn)的方法如下:
'用關(guān)鍵字對應(yīng)的值插入值,在文檔中在有域的地方插入對應(yīng)的值
Public Function InsertValue() As Boolean
Dim i, Count As Integer
Dim KeyWord As String
Dim Value, Data
Dim mySelection As Selection
Count = wdDoc.Fields.Count
For i = 1 To Count
If wdDoc.Fields.Item(i).Type = 81 Then
KeyWord = wdDoc.Fields.Item(i).Data
If Right(KeyWord, 1) <> "F" Then
Value = clsDB.GetFieldValues("工程", KeyWord)
wdDoc.Fields.Item(i).Select()
mySelection = wdApp.Selection '插入點(diǎn)
If mySelection.Tables.Count <> 0 Then
'clear text
mySelection.Cells.Item(1).Select()
mySelection.Delete()
'還原原域
InsertField(KeyWord)
End If
wdDoc.Fields.Item(i).Result.Text = Value(0).itemarray(0)
End If
End If
Next
End Function