首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> Delphi

Delphi 與 Word 整合開發指南:OLE 自動化、COM 介面與 VBA 巨集互呼

     編輯:Delphi

Microsoft Word 內建強大的 COM 自動化介面,讓 Delphi 可完整控制文件建立、編輯、列印、郵件合併等功能。本文系統整理四種整合方式優劣、核心物件模型操作、資料庫二進位欄位存取 Word 檔、全域訊息跨程序通訊、動態工具列建立等實戰技巧。

四種整合方式比較

方式元件/技術優點缺點
1. 嵌入式TOleContainer最簡單,文件內嵌於表單,視覺整合度高無法以程式控制 Word 物件模型
2. 伺服器元件Delphi 產生的 Word 伺服器包裝元件支援程式碼提示,開發效率高無法呼叫自訂 VBA 巨集;選用參數必須全部填寫
3. 純 COM 匯入匯入 MSWORD9.OLB 類型庫功能完整,屬早期綁定部署需註冊類型庫;選用參數同樣需全填
4. 執行期繫結 (推薦)CreateOleObject('Word.Application')完整存取所有屬性/方法/自訂巨集;選用參數可省略無程式碼提示;例外處理需自行撰寫

核心操作範例 (方式 4:CreateOleObject)

啟動/連接 Word

var
  WordApp: Variant;
begin
  try
    WordApp := GetActiveOleObject('Word.Application');
  except
    WordApp := CreateOleObject('Word.Application');
  end;
  WordApp.Visible := True;

新建/開啟/儲存文件


// 新建 (可指定範本)
Doc := WordApp.Documents.Add(Template:='C:\Template.dot', NewTemplate:=False);

// 開啟
Doc := WordApp.Documents.Open(FileName:=DocFile, ReadOnly:=False, AddToRecentFiles:=False);

// 另存新檔
WordApp.Documents.SaveAs(FileName:=DocFile, FileFormat:=wdFormatDocument, AddToRecentFiles:=False);

資料庫 Blob 欄位與 Word 檔雙向轉換

uses ADODB, Classes;

// 將 Word 檔存入資料庫 Image/Blob 欄位
var FS: TFileStream;
begin
  FS := TFileStream.Create(TargetName, fmOpenWrite or fmCreate);
  try
    FS.Position := 0;
    TBlobField(AdoQuery1.FieldByName('DocContent')).SaveToStream(FS);
  finally
    FS.Free;
  end;
end;

// 從資料庫讀取 Blob 存成 Word 檔
var FS: TFileStream;
begin
  FS := TFileStream.Create(TargetName, fmOpenWrite or fmCreate);
  try
    FS.Position := 0;
    TBlobField(ADOQuery1.FieldByName('DocContent')).LoadFromStream(FS);
  finally
    FS.Free;
  end;
end;

跨程序通訊:全域視窗訊息

Delphi 主程式與 Word (或 VBA) 互為獨立進程,使用 RegisterWindowMessage 取得唯一訊息 ID,雙方以 SendMessage 交換資料。


// 註冊 (雙方相同字串可取得同一 ID)
const MsgStr = 'MYAPP_WORD_SYNC_123';
var MsgID: Cardinal;
MsgID := RegisterWindowMessage(PChar(MsgStr));

// 發送
SendMessage(TargetHwnd, MsgID, WPARAM, LPARAM);

// Delphi 接收 (重寫 WndProc)
procedure WndProc(var Message: TMessage); override;
begin
  if Message.Msg = MsgID then
  begin
    // 處理 Word 傳來的資料
    HandleWordMessage(Message.WParam, Message.LParam);
  end
  else
    inherited;
end;

Word VBA 進階:動態工具列與事件處理

建立類別模組 ComboHandler 捕捉 ComboBox 事件

' 類別模組 ComboHandler
Public WithEvents ComboBoxEvent As Office.CommandBarComboBox

Private Sub ComboBoxEvent_Change(ByVal Ctrl As Office.CommandBarComboBox)
  ' 使用者選擇文件清單時觸發
  ThisDocument.Application.Run 'DelphiSyncMessage', Ctrl.Text
End Sub

標準模組動態建立工具列與 ComboBox

Dim ctlHandler As New ComboHandler
Dim cbo As CommandBarComboBox

Sub CreateDocPicker()
  Set cbo = CommandBars("我的工具列").Controls.Add(Type:=msoControlComboBox, Temporary:=True)
  cbo.AddItem "文件一.doc", 1
  cbo.AddItem "文件二.doc", 2
  Set ctlHandler.ComboBoxEvent = cbo ' 連接事件
End Sub

常用 Word 指令巨集對照表

巨集名稱功能
FileNew新建文件
FileOpen開啟文件
FileSaveAs另存新檔
FilePrint列印
FilePrintPreview列印預覽
ToolsOptions選項設定
ViewVBCode開啟 VBA 編輯器
InsertHyperlink插入超連結
FormatStyle樣式設定

文件事件對照

  • AutoExec:Word 啟動/全域樣板載入
  • AutoOpen:開啟文件時
  • AutoClose:關閉文件時
  • Document_Close:文件關閉事件 (VBA 事件模型)
  • DocumentBeforeClose:應用程式層級關閉前事件,可攔截存檔提示
  • DocumentChange:文件切換事件

部署與安全性提醒

  • VBA 巨集病毒風險:關鍵演算法勿放在 VBA,改以 Delphi DLL 或加密 COM 元件實作。
  • 目標機器需安裝相容版本 Word;建議檢查 WordApp.Version 相容性。
  • 釋放 COM 物件:WordApp.Quit; WordApp := Unassigned; 避免殘留 WINWORD.EXE 進程。

小結

Delphi 整合 Word 的最佳實務是「執行期繫結 + Variant 型別 + 全域訊息同步」。雖失去設計期提示,卻換來最大彈性:可呼叫任意 VBA 巨集、省略選用參數、動態建立 UI。搭配資料庫 Blob 存取,即可構建完整的文件管理、報表產生、郵件合併系統。

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