本文介紹了Word域與數據庫結合的方法
給用戶提供一個插入Word域的界面
並把數據庫的數據填充到Word文件中
域是Word中最具有實用價值的功能之一
它表示文檔中可能發生變化的數據或郵件合並文檔中套用信函
標簽中的占位符
Microsoft Word 可以在您使用一些特定命令時插入域
如
插入
菜單上的
日期和時間
命令
您也可使用
插入
菜單上的
域
命令手動插入域
事實上
我們在日常工作中常會脫離Microsoft Word的操作環境
一般
用戶是先建立好一些Word文件模板
然後利用所提供的應用程序功能向Word文件模板中插入域
用該域對應的值取代域值
這樣就達到了向Microsoft Word文件中插入數據的作用
我們常把數據放入數據庫中
數據庫的內容不斷地變化
我們的域值也跟著不斷地變化
取到靈活自動更新的作用
要達到這方面的功能
就應該把數據庫與Word域結合起來
解決方法
首先要解決這一問題
我們必須先了解Word域有關的知識
Word域代碼位於花括號或大括號 ( { } )中
域類似於 Microsoft Excel 中的公式
域代碼類似於公式
域結果(域結果
當 Microsoft Word 執行域指令時
在文檔中插入的文字或圖形
在打印文檔或隱藏域代碼時
將以域結果替換域代碼
)類似於公式產生的值
可在文檔中切換顯示域代碼及其結果
正好
數據庫的字段名對應域代碼
字段值對應域值
我們利用VBA編程可以達到目的
VBA for Word 中有關域的類型很多
其中Type:=wdFieldAddin是一種關於字段與字段值對應的特殊域
正是借助它的功能解決問題
我們可以這麼設想
用戶先打開Word文件
然後向打開的Word文件中插入域
然後用數據庫的數據填充
插入域時有二種可能
一種是單值域
即一個域代碼對應一個域值(一對一關系)
這種情況的域可以插入任何地方
另一種情況是多值域
即一個域代碼對應多個域值(一對多關系)
這種情況的域只能插入表格中
並且當表格的行數比域值少時
要能自動提供增加表格行的功能
實例說明
利用Visual Basic
Net編寫通用的類
給用戶提供可視化的編輯界面
用於用戶在Word文件中插入域標志
針對Word文件或Excel表格文件
掃描整個文件
將其中的域標志取出來
然後通過從數據庫中取出字段所對應的值
將值填寫到文件中域對應的位置
若對應位置已有值
則判斷該值與要填寫的值是否相同
若不同則替換之
插入值分為
A
單純的值
直接使用一個值替換域
B
表格中的單元格
若該表格填寫不下
是否增加表格單元?以及與該單元關聯的域等
例如
有二個Access數據庫的表(
表
對應單值域
表
對應多值域)如下
利用VBA編寫的一個通用的處理Word域的程序
開發步驟如下
建立項目
向項目中增加處理Word域的類
啟動Visual Studio
NET
在新建項目中選擇Visual Basic項目
在模板中選擇Windows應用程序
把工程名更改為WordDoc
● 向工程中增加名稱為CWordDoc的類
● 定義的CWordDoc類的屬性
代碼如下
定義Word應用對象及文檔對象
Private wdApp As New Word
Application()
Private wdDoc As New Word
Document()
所處理的Word模板文件
Private FileName As String
域的個數及對應的數組
Dim FieldCount As Int
Dim MyField()
Word是否已運行
Private IsWordRunning As Boolean
是否已經插入了表格行
Private IsInsertRow As Boolean
Word工具欄對象及菜單欄對象數組
Dim CommandBarIndex() As Integer
Dim SaveCommandBarmenuIndex() As Integer
● 定義的CWordDoc類的方法
定義打開Word文件的方法
建立Word應用對象和文檔對象
並打開Word文件
設定Word已經運行
VBA編程主要是先建立某一個應用程序的對象
然後按需要處理應用對象
Word應用對象是
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環境的大小
Word啟動後一般是全屏幕(最大化)
要把用戶操作界面顯示出來
不被Word遮蔽
處理的方法是把用戶界面設為頂層窗體
也可使用戶界面與Word各自處在自己位置
平行布置
這裡是讓用戶界面位於屏幕的最頂上
Word位於用戶界面的下面
因此要重新調整Word的位置
這需要設置Word窗體狀態為普通類型(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文檔對象中域對象的Add方法向Word文件中插入域
域的Data屬性代表該域的名稱
插入域時應該選取插入點(Selection)
即用戶光標處位置
如果該位置是單元格且已插入域
應該提示是否覆蓋
插入域時要分析是插入單值域還是多值域
根據關鍵字的後綴識別
關鍵字的最後一個字符是
F
時則為多值域
多值域只能插入在表格中
是否是表格以插入點的單元格識別
實現該功能的代碼如下
在文檔中插入域
KeyWord:域的關鍵字
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
插入點
If KeyWord
Chars(KeyWord
Length
) = "F" Then
If IsCell(mySelection) <> True Then
MsgBox("該位置不是單元格
請選擇單元格"
vbOKOnly + vbExclamation)
Exit Function
End If
End If
If IsCell(mySelection) = True Then
If CellFieldCount(mySelection) >
Then
If MsgBox("該單元格已有域
是否覆蓋?"
vbYesNo) =
Then
mySelection
Cells
Item(
)
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
我們可以通過選擇點的表格數判斷插入點的性質
表格數為
則選擇點不位於單元格中
反則不位於單元格中
選擇點(光標)是否是單元格
Private Function IsCell(ByVal mySelection As Selection) As Boolean
If mySelection
Tables
Count >
Then
Return True
Else
Return False
End If
End Function
計算選擇點(光標)的單元格的域數
Private Function CellFieldCount(ByVal mySelection As Selection) As Integer
CellFieldCount = mySelection
Cells
Item(
)
Range
Fields
Count
End Function
記錄插入域代碼及關鍵字
這裡主要是調用上面的InsertField方法
Public Function InsertFieldByKeyWord(ByVal KeyWord As String) As Integer
Dim ID As Integer
FieldCount = FieldCount +
ReDim MyField(FieldCount)
ID = InsertField(KeyWord)
MyField(FieldCount)
ID = ID
MyField(FieldCount)
KeyWord = KeyWord
End Function
當Word文件已經插入了域
就要填充域值
填充域值應該分為二種情況考慮
一種是單值域
一種是多值域
單值域是一一對應關系
僅取出值域插入到對應的位置
實現的方法是掃描整個文檔
找出是用戶插入的域(Fields
Type =
)
用域值取代之
這裡用到了一個由關鍵字得到值的方法GetFieldValues
這個方法在後面將會講到
對應的是數據庫的
工程
表
怎樣保證永遠僅插入一個值呢?方法是先清除掉原域值和域代碼
再在當前插入點插入域代碼和域值
實現的方法如下
用關鍵字對應的值插入值
在文檔中在有域的地方插入對應的值
Public Function InsertValue() As Boolean
Dim i
Count
From:http://tw.wingwit.com/Article/Common/201311/4946.html