直接使用 C++ 呼叫 Word COM 介面(Automation)參數繁多、程式碼冗長且難維護。本文採用「產生 VB Script 字串 → 執行 Script」的間接策略:利用 Word 內建巨集錄製功能取得 VBA 代碼,稍加修改轉為 VBScript,再由 C++ 組裝字串並呼叫 RunScript 執行。此法參數少、可讀性高、易於維護與擴充。
// 建立新文件
std::string create_new();
// 儲存文件
std::string close_save(const char* filename);
// 游標下移
std::string move_down();
// 插入段落斷
std::string put_Paragraph();
// 加入標題(可指定樣式、對齊)
std::string put_title(const char* title, const char* title_type="標題 1", int align=ALIGN_LEFT);
// 便利函式:標題 1/2/3
std::string put_title1(const char* title, int align=ALIGN_CENTER);
std::string put_title2(const char* title, int align=ALIGN_LEFT);
std::string put_title3(const char* title, int align=ALIGN_LEFT);
// 紅色警告訊息
std::string add_warning_msg(const char* msg="無資料");
// 表格處理
std::string add_grid_ln(const char* line); // 單列(內部用)
std::string put_grid(const char* content); // 整張表格
// 執行腳本
extern "C" void RunScript(const char* script_str);
int main(int argc, char* argv[])
{
std::ostringstream ostr;
// 1. 建立新文件
ostr << create_new();
// 2. 加入主標題(置中)
ostr << put_title1("產品測試報告");
// 3. 加入次標題
ostr << put_title2("測試環境");
// 4. 插入段落文字
ostr << put_Paragraph();
ostr << "作業系統: Windows 10 Pro\n";
ostr << "編譯器: Visual Studio 2022\n";
// 5. 從文字檔讀取表格資料並插入
std::string str_buffer;
read_file_as_grid_content("tab.txt", str_buffer); // 需自行實作
ostr << put_grid(str_buffer.c_str());
// 6. 加入警告訊息
ostr << add_warning_msg("部分測試項目未通過,請複查。");
// 7. 儲存並關閉
ostr << close_save("c:\\test.doc");
// 8. 執行腳本(需安裝 Word XP 以上)
RunScript(ostr.str().c_str());
return 0;
}
C++ 程式
│
├─ 組裝 VBScript 字串(ostringstream)
│ │
│ ├─ create_new() → "Set objWord = CreateObject(\"Word.Application\") ..."
│ ├─ put_title1(...) → "objWord.Selection.Style = \"標題 1\" ..."
│ ├─ put_grid(...) → "objWord.ActiveDocument.Tables.Add ..."
│ └─ close_save("c:\\test.doc") → "objDoc.SaveAs \"c:\\test.doc\" ..."
│
└─ RunScript(script_str) → 呼叫 Windows Script Host (wscript/cscript) 執行
│
▼
Word 自動化執行腳本內容
│
▼
產生 c:\test.doc
| 傳統 C++ Automation | VB Script 間接法 |
|---|---|
| 需處理 VARIANT、BSTR、IDispatch 等複雜型別 | 純字串操作,型別簡單 |
| 參數順序、選擇性參數易出錯 | VBScript 可省略選擇性參數 |
| 除錯困難,錯誤訊息晦澀 | 可先輸出 .vbs 檔雙擊測試 |
| 程式碼冗長,維護成本高 | 模組化函式,邏輯清晰 |
| 難以利用 Word 巨集錄製結果 | 直接參考/修改巨集代碼 |
RunScript 內部通常呼叫 WScript.Shell 的 Run 方法執行 cscript.exe //nologo //E:vbscript 或寫入暫存 .vbs 檔再執行。read_file_as_grid_content 需自行解析組裝為 VBScript 的 Tables.Add 參數字串。objWord.Visible = True 方便監控,正式部署再設為 False。CWordReport 類別,提供 AddParagraph、AddTable、InsertImage 等高階介面。On Error Resume Next 並記錄錯誤至日誌檔。此「腳本代理」模式不僅適用於 Word,同樣可套用於 Excel、PowerPoint、Outlook 等 Office 套件自動化,是 C++ 開發者快速整合 Office 功能的實用利器。