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

C++Builder OLE 自動化寫入 Word 完整代碼:從文本到表格一站式導出

     編輯:程式設計綜合問答

完整按鈕事件代碼

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 接口映射表

操作COM 對象/方法參數說明
創建 WordCreateObject("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))
  • 大量表格數據:考慮先生成 HTML/RTF 字符串,一次性 Range.PasteAndFormat,比逐單元格寫入快 10 倍以上
  • 服務端場景:優先評估 OpenXML SDK / LibreOffice 無 Office 依賴方案
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved