在開發需要產生 Word 文件的 C++ 應用程式時,直接呼叫 Microsoft Office 自動化介面雖然功能完整,但參數繁多、程式碼冗長,開發效率極低。參考 MSDN 文件《Automating Microsoft Office 97 and Office 2000》雖然詳盡,但實際操作起來相當繁瑣。
為了簡化開發流程,我們採用「先生成 VB 腳本,再執行腳本建立 Word 文件」的策略。此法優勢明顯:
我們設計了一組輕量級函數封裝常用操作,專注於簡易表格文件的生成:
// 建立新文件
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);
// 快速新增各級標題
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);
以下範例示範如何組合上述函數生成包含標題、表格與警告訊息的 Word 文件,輸出路徑為 c:\test.doc,需安裝 Word XP 環境:
int main(int argc, char* argv[])
{
ostringstream ostr;
ostr << create_new();
ostr << put_title1("測試報表", ALIGN_CENTER);
ostr << put_Paragraph();
ostr << put_title2("資料明細", ALIGN_LEFT);
std::string str_buffer;
read_file_as_grid_content("tab.txt", str_buffer); // 讀取外部資料
ostr << put_grid(str_buffer.c_str());
ostr << put_Paragraph();
ostr << add_warning_msg("此為自動產生之測試文件");
ostr << close_save("c:\\test.doc");
// 除錯用:輸出腳本內容檢查
/*
std::ofstream ofile;
ofile.open("c:\\temp.vbs");
ofile << ostr.str();
ofile.close();
*/
// BeginWaitCursor();
RunScript(ostr.str().c_str()); // 執行生成的 VBScript
// EndWaitCursor();
return 0;
}
此架構將 Word 自動化的複雜度封裝於腳本生成層,C++ 主程式僅需專注於業務邏輯與資料組裝,極大提升開發效率與程式碼可維護性。