核心代碼(按鈕點擊事件)
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant vWordApp;
try {
// 1. 創建/連接 Word 應用程序
vWordApp = Variant::CreateObject("Word.Application");
} catch (...) {
MessageBox(0, L"啟動 Word 失敗,請確認已安裝 Microsoft Word。", L"提示", MB_OK | MB_ICONERROR);
return;
}
// 2. 顯示 Word 窗口(調試時可見,生產可設 false 後台生成)
vWordApp.OlePropertySet("Visible", true);
// 3. 新建文檔
Variant vDoc = vWordApp.OlePropertyGet("Documents").OleFunction("Add");
// 4. 獲取 Selection 對象(插入點)
Variant vSel = vWordApp.OlePropertyGet("Selection");
// 5. 寫入 Memo 內容
String str = Memo1->Text;
vSel.OleProcedure("TypeText", WideString(str));
vSel.OleProcedure("TypeParagraph"); // 換段
// 6. 可選:移動到文末繼續寫入
vWordApp.OlePropertyGet("Selection").OleProcedure("EndKey", 6); // wdStory = 6
}
關鍵點解析
| 步驟 | COM 接口 | 說明 |
| 創建實例 | CreateObject("Word.Application") | 啟動新 Word 進程,或連接現有實例(GetActiveObject) |
| 顯示/隱藏 | Visible 屬性 | true 可見,false 後台生成較快 |
| 新建文檔 | Documents.Add() | 返回 _Document 對象 |
| 插入文本 | Selection.TypeText() | 需 WideString 避免中文亂碼 |
| 換行/換段 | TypeParagraph() | 比 TypeText("\r\n") 語義更準確 |
進階:插入表格、設置格式、保存路徑
// 插入 4行5列 表格
int nRow = 4, nCol = 5;
vDoc.OlePropertyGet("Tables").OleProcedure("Add",
vSel.OlePropertyGet("Range"), nRow, nCol, 1, 0);
// 設置字體
vSel.OlePropertyGet("Font").OlePropertySet("Name", "微軟雅黑");
vSel.OlePropertyGet("Font").OlePropertySet("Size", 12);
vSel.OlePropertyGet("Font").OlePropertySet("Bold", true);
// 另存為指定路徑
vDoc.OleProcedure("SaveAs", WideString("D:\\Export.docx"));
vDoc.OleProcedure("Close", false);
vWordApp.OleProcedure("Quit");
常見問題排查
- 「類未註冊」/「無法創建對象」:未安裝 Word 或版本不匹配(需 2007+ 支持 .docx)
- 中文亂碼:所有字符串傳遞均用
WideString,確保 Unicode 編碼
- 殘留 Word 進程:異常分支中調用
vWordApp.OleProcedure("Quit"),並在 finally 釋放 Variant
- 權限問題:目標保存目錄需當前用戶寫入權限
替代方案對比
| 方案 | 優點 | 缺點 | 適用場景 |
| OLE 自動化 (本文) | 完美兼容 Word 排版、支持複雜格式 | 需安裝 Word、啟動慢、佔用高 | 桌面端、格式要求高 |
| LibreOffice UNO API | 免費、跨平台、無需 Office | 需安裝 LibreOffice、格式兼容稍弱 | 服務端、Linux 環境 |
| DocX / OpenXML SDK | 無依賴、純代碼生成、高性能 | 複雜排版開發難度大 | 批量報表、服務端 |