熱點推薦:
您现在的位置: 電腦知識網 >> 電腦常識 >> 正文

Word域與數據庫的結合編程

2013-11-11 13:59:46  來源: 電腦常識 

  本文介紹了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 BasicNet編寫通用的類給用戶提供可視化的編輯界面用於用戶在Word文件中插入域標志針對Word文件或Excel表格文件掃描整個文件將其中的域標志取出來然後通過從數據庫中取出字段所對應的值將值填寫到文件中域對應的位置若對應位置已有值則判斷該值與要填寫的值是否相同若不同則替換之插入值分為
  A單純的值直接使用一個值替換域
  B表格中的單元格若該表格填寫不下是否增加表格單元?以及與該單元關聯的域等
  例如有二個Access數據庫的表(對應單值域對應多值域)如下
   
  利用VBA編寫的一個通用的處理Word域的程序開發步驟如下
  
  建立項目向項目中增加處理Word域的類
  
  啟動Visual StudioNET在新建項目中選擇Visual Basic項目在模板中選擇Windows應用程序把工程名更改為WordDoc
  
  ● 向工程中增加名稱為CWordDoc的類
  
  ● 定義的CWordDoc類的屬性代碼如下
  
  定義Word應用對象及文檔對象
  Private wdApp As New WordApplication()
  Private wdDoc As New WordDocument()
  所處理的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應用對象是WordApplication通過CreateObject方法建立之代碼如下
  Public Sub OpenWordDocument(ByVal FileName As String)
    wdApp = CreateObject("WordApplication")
    wdAppDocumentsOpen(FileName)
    wdDoc = wdAppActiveDocument
    wdDocActiveWindowDocumentMap = False
    wdAppVisible = True
    IsWordRunning = True
   End Sub
  
  保存Word文件 代碼如下
  
  Public Sub SaveWordDocument()
    wdDocSaveAs(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)
    wdAppWindowState = WordWdWindowStatewdWindowStateNormal
    wdAppLeft = Left
    wdAppTop = top
    wdAppWidth = width
    wdAppHeight = 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
    wdAppSelectionCollapse(Direction:=wdCollapseEnd)
    mySelection = wdAppSelection   插入點
    If KeyWordChars(KeyWordLength ) = "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
          mySelectionCellsItem()Select()
          mySelectionDelete()
        Else
          Exit Function
        End If
      End If
    End If
    MyField = wdDocFieldsAdd(Range:=mySelectionRange Type:=wdFieldAddin)
    MyFieldData = KeyWord
  End Function
  我們可以通過選擇點的表格數判斷插入點的性質表格數為則選擇點不位於單元格中反則不位於單元格中
  選擇點(光標)是否是單元格
  Private Function IsCell(ByVal mySelection As Selection) As Boolean
    If mySelectionTablesCount > Then
      Return True
    Else
      Return False
    End If
  End Function
  計算選擇點(光標)的單元格的域數
  Private Function CellFieldCount(ByVal mySelection As Selection) As Integer
    CellFieldCount = mySelectionCellsItem()RangeFieldsCount
  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文件已經插入了域就要填充域值填充域值應該分為二種情況考慮一種是單值域一種是多值域單值域是一一對應關系僅取出值域插入到對應的位置實現的方法是掃描整個文檔找出是用戶插入的域(FieldsType = )用域值取代之這裡用到了一個由關鍵字得到值的方法GetFieldValues這個方法在後面將會講到對應的是數據庫的工程怎樣保證永遠僅插入一個值呢?方法是先清除掉原域值和域代碼再在當前插入點插入域代碼和域值實現的方法如下
  用關鍵字對應的值插入值在文檔中在有域的地方插入對應的值
  Public Function InsertValue() As Boolean
    Dim i Count
From:http://tw.wingwit.com/Article/Common/201311/4946.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.