void __fastcall TForm1::Button1Click(TObject *Sender)
{
Variant vWordApp;
try {
vWordApp = Variant::CreateObject("Word.Application");
} catch (...) {
MessageBox(0, L"啟動 Word 失敗,請確認已安裝。", L"錯誤", MB_OK | MB_ICONERROR);
return;
}
vWordApp.OlePropertySet("Visible", true);
Variant vDoc = vWordApp.OlePropertyGet("Documents").OleFunction("Add");
Variant vSel = vWordApp.OlePropertyGet("Selection");
// 1. 插入第一段文本
String str1 = "要插入的第一段文字\r\n換一個行先";
vSel.OleProcedure("TypeText", WideString(str1));
vSel.OleProcedure("TypeParagraph");
// 2. 插入 4行5列 表格
int nRow = 4, nCol = 5;
vWordApp.OlePropertyGet("ActiveDocument").OlePropertyGet("Tables")
.OleProcedure("Add", vSel.OlePropertyGet("Range"), nRow, nCol, 1, 0);
// 3. 移動游標到文檔末尾
vWordApp.OlePropertyGet("Selection").OleProcedure("EndKey", 6); // wdStory
// 4. 插入第二段文本
String str2 = "要插入的第二段文字";
vSel.OleProcedure("TypeText", WideString(str2));
}
| 操作 | COM 對象/方法 | 參數說明 |
|---|---|---|
| 創建 Word | CreateObject("Word.Application") | 返回 _Application |
| 新建文檔 | Documents.Add() | 返回 _Document |
| 獲取插入點 | Selection | 返回 Selection 對象 |
| 寫文本 | TypeText(WideString) | Unicode 字符串 |
| 換段 | TypeParagraph() | 語義換段,非單純換行 |
| 插入表格 | Tables.Add(Range, Rows, Cols, Behavior, AutoFit) | Behavior=1(wdWord9TableBehavior), AutoFit=0(wdAutoFitFixed) |
| 移動到文末 | Selection.EndKey(Unit) | Unit=6 (wdStory) |
| 保存 | SaveAs(FileName) | 完整路徑 |
| 關閉/退出 | Close() / Quit() | 釋放資源 |
所有傳遞給 Word 的字符串**必須**用
WideString包裝,否則極大概率亂碼。
Variant vWordApp, vDoc, vSel;
try {
vWordApp = Variant::CreateObject("Word.Application");
vWordApp.OlePropertySet("Visible", false); // 後台生成更快
vDoc = vWordApp.OlePropertyGet("Documents").OleFunction("Add");
vSel = vWordApp.OlePropertyGet("Selection");
// ... 寫入邏輯 ...
vDoc.OleProcedure("SaveAs", WideString("D:\\Report.docx"));
} catch (const Exception& e) {
ShowMessage("導出失敗: " + e.Message);
} catch (...) {
ShowMessage("未知 COM 錯誤");
}
__finally {
// 確保釋放 COM 引用,避免殘留 WINWORD.EXE 進程
if (!vDoc.IsEmpty()) vDoc.OleProcedure("Close", false);
if (!vWordApp.IsEmpty()) vWordApp.OleProcedure("Quit");
vSel.Clear(); vDoc.Clear(); vWordApp.Clear();
}
Visible = false、ScreenUpdating = false(vWordApp.OlePropertySet("ScreenUpdating", false))Range.PasteAndFormat,比逐單元格寫入快 10 倍以上OpenXML SDK / LibreOffice 無 Office 依賴方案