企業常需依資料庫資料批量生成合約、報告、證書等 Word 文件。透過 Word 域作為佔位符,程式自動填充資料,實現「模板+資料」分離的文件自動化。
{ FIELD_TYPE "KeyName" },類似 Excel 公式wdFieldAddin 允許自定義域名稱與值的映射┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Word 模板 │────▶│ 掃描域標記 │────▶│ 資料庫查詢 │
│ (.doc/.dot)│ │ (關鍵字) │ │ (欄位值) │
└─────────────┘ └─────────────┘ └─────────────┘
│ │
▼ ▼
┌─────────────┐ ┌─────────────┐
│ 填充域值 │◀────│ 回寫文件 │
│ (單值/多值)│ │ 另存新檔 │
└─────────────┘ └─────────────┘
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
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
工程驗收單:
模板預設表格 3 行,實際資料 10 筆 → 程式自動增行至 10 行並逐行填入。
Word 域與資料庫整合是文件自動化的經典方案,掌握單/多值域處理、表格動態擴展技巧,可快速建構企業級文件生成系統。