首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Word 域與資料庫整合自動化文件生成實戰

     編輯:MySQL 資料庫相關知識

應用場景

企業常需依資料庫資料批量生成合約、報告、證書等 Word 文件。透過 Word 域作為佔位符,程式自動填充資料,實現「模板+資料」分離的文件自動化。

核心技術原理

  • Word 域代碼:{ FIELD_TYPE "KeyName" },類似 Excel 公式
  • ADDIN 域類型:wdFieldAddin 允許自定義域名稱與值的映射
  • 單值域:一對一映射,可放任意位置
  • 多值域:一對多映射,需置於表格中,自動擴展行數

系統架構設計

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│  Word 模板  │────▶│  掃描域標記  │────▶│  資料庫查詢  │
│  (.doc/.dot)│     │  (關鍵字)   │     │  (欄位值)   │
└─────────────┘     └─────────────┘     └─────────────┘
                           │                    │
                           ▼                    ▼
                    ┌─────────────┐     ┌─────────────┐
                    │  填充域值   │◀────│  回寫文件   │
                    │  (單值/多值)│     │  另存新檔   │
                    └─────────────┘     └─────────────┘

關鍵類別實作

CWordDoc 類別 - Word 操作核心

Public Class CWordDoc
    Private wdApp As Word.Application
    Private wdDoc As Word.Document
    
    ' 開啟文件並隱藏工具列
    Public Sub OpenWordDocument(fileName As String)
        wdApp = CreateObject("Word.Application")
        wdApp.Documents.Open(fileName)
        wdDoc = wdApp.ActiveDocument
        wdApp.Visible = True
        CloseCommandBar()  ' 隱藏干擾性 UI
    End Sub
    
    ' 插入域(使用者介面呼叫)
    Public Function InsertField(keyWord As String) As Integer
        Dim sel = wdApp.Selection
        ' 多值域識別:關鍵字以 F 結尾
        If keyWord.EndsWith("F") Then
            If Not IsInTableCell(sel) Then Throw New Exception("多值域必須在表格儲存格中")
        End If
        ' 檢查儲存格是否已有域
        If IsInTableCell(sel) AndAlso CellFieldCount(sel) > 0 Then
            If Not ConfirmOverwrite() Then Return -1
        End If
        Dim fld = wdDoc.Fields.Add(sel.Range, Word.WdFieldType.wdFieldAddin)
        fld.Data = keyWord
        Return fld.Index
    End Function
    
    ' 填充單值域
    Public Sub FillSingleValues()
        For Each fld In wdDoc.Fields
            If fld.Type = 81 AndAlso Not fld.Data.EndsWith("F") Then
                Dim val = DB.GetFieldValue("ProjectTable", fld.Data)
                fld.Select()
                ClearCellContent(fld)
                fld.Result.Text = val
            End If
        Next
    End Sub
    
    ' 填充多值域(表格自動增行)
    Public Sub FillMultiValues()
        For Each fld In wdDoc.Fields
            If fld.Type = 81 AndAlso fld.Data.EndsWith("F") Then
                Dim key = fld.Data.TrimEnd("F")
                Dim rows = DB.GetFieldValues("CheckTable", key)  ' 陣列
                fld.Select()
                Dim sel = wdApp.Selection
                ClearCellContent(sel)
                ' 第一筆寫入原儲存格
                fld.Result.Text = rows(0)
                ' 後續筆數:檢查行數、不足則增行、逐行填入
                For i = 1 To rows.Length - 1
                    EnsureTableRows(sel, rows.Length)
                    sel.MoveDown(Unit:=Word.WdUnits.wdLine, Count:=1)
                    sel.TypeText(rows(i))
                Next
            End If
        Next
    End Sub
End Class

COleDataAccess 類別 - 資料庫存取

Public Class COleDataAccess
    Private conn As OleDbConnection
    
    Public Sub Connect(dbPath As String)
        conn = New OleDbConnection($"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={dbPath}")
        conn.Open()
    End Sub
    
    Public Function GetFieldValue(table As String, field As String) As String
        Dim dt = GetDataTable($"SELECT {field} FROM {table}")
        Return dt.Rows(0)(0).ToString()
    End Function
    
    Public Function GetFieldValues(table As String, field As String) As String()
        Dim dt = GetDataTable($"SELECT {field} FROM {table}")
        Return dt.Rows.Cast(Of DataRow).Select(Function(r) r(field).ToString()).ToArray()
    End Function
End Class

使用者介面流程

  1. 開啟 Word 模板文件
  2. 從下拉選單選擇欄位 → 點擊文件位置插入單值/多值域
  3. 點擊「填充資料」按鈕 → 自動查詢資料庫並填入所有域
  4. 另存新檔產出最終文件

實戰應用範例

工程驗收單:

  • 單值域:專案名稱、合約編號、驗收日期、總金額
  • 多值域:驗收項目明細表(項目名稱、規格、數量、單價、備註)

模板預設表格 3 行,實際資料 10 筆 → 程式自動增行至 10 行並逐行填入。

部署與整合

  • 編譯為 DLL 元件,供 ERP/CRM 系統呼叫
  • 支援批次處理:迴圈遍歷資料庫記錄,逐筆生成文件
  • 可擴充:支援圖片域、條碼域、條件式顯示/隱藏

注意事項

  1. 需安裝 Microsoft Word(或使用 OpenXML/LibreOffice 免 Office 方案)
  2. 伺服器端自動化需注意 DCOM 權限、互動式桌面限制
  3. 大量生成時建議使用 OpenXML SDK 直接操作 .docx,效能更高、無 Office 相依
  4. 域名稱建議採用英文底線格式,避免特殊字元問題

Word 域與資料庫整合是文件自動化的經典方案,掌握單/多值域處理、表格動態擴展技巧,可快速建構企業級文件生成系統。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved