C++ Builder 透過 Variant 類別的四大方法間接呼叫 Excel 物件模型:
OlePropertyGet (取屬性) → 宏 PGOlePropertySet (設屬性) → 宏 PSOleFunction (呼叫函數) → 宏 FNOleProcedure (呼叫程序) → 宏 PR需包含 vcl\utilcls.h。範例:
#define PG OlePropertyGet
#define PS OlePropertySet
#define FN OleFunction
#define PR OleProcedure
Variant Excel = Variant::CreateObject("Excel.Application");
Excel.PS("Visible", true);
Variant Workbooks = Excel.PG("Workbooks");
Variant Workbook = Workbooks.FN("Add");
Variant Sheets = Workbook.PG("Sheets");
Variant Sheet = Sheets.PG("Item", 1);
Sheet.PG("Cells", 1, 1).PS("Value", "Hello Excel");
Workbook.FN("SaveAs", "C:\\test.xls");
Excel.PR("Quit");
在專案中匯入 Excel 類型庫 (Project → Import Type Library),產生對應的 C++ 包裝類別 (如 _Application, _Workbook, _Worksheet, Range 等)。此法提供程式碼提示、編譯期型別檢查、效能較佳。
#include "Excel_TLB.h"
_ApplicationPtr Excel;
Excel.CreateInstance("Excel.Application");
Excel->Visible = true;
_WorkbookPtr Book = Excel->Workbooks->Add();
_WorksheetPtr Sheet = Book->ActiveSheet;
Sheet->Cells->Item[1][1] = "Hello";
Book->SaveAs("C:\\test.xls");
Excel->Quit();
| 特性 | Variant (晚期繫結) | 類型庫 (早期繫結) |
|---|---|---|
| 部署 | 無需額外檔案 | 需註冊/部署 TLB 或包含產生的 .h/.cpp |
| 開發效率 | 無智慧提示,易拼錯 | 完整代碼提示,編譯檢查 |
| 執行效能 | 較慢 (IDispatch 呼叫) | 較快 (虛函數表直接呼叫) |
| 版本相容 | 較好 (動態解析) | 需對應版本 TLB |
簡單腳本或版本不固定環境用 Variant;大型專案、追求穩定效能建議匯入類型庫。