BCB6 提供的 TExcelApplication、TExcelWorkbook、TExcelWorksheet 等 Server 控件優勢:
EA->set_DisplayAlerts(0, false); EA->Quit(); 直觀優雅OLE Automation 的 OleGetProperty/OleSetProperty 為弱類型,運行期才發現拼寫錯誤。
C:\Program Files\Microsoft Office\OFFICE11\2052\VBAXL11.chm 等(有效性 85%,簡易性 80%)C:\Program Files\Borland\CBuilder6\Include\Vcl\excel_2k.h(8MB+,有效性 100%,簡易性 10%)三者結合驗證,如 Worksheets.Move 方法在三處定義完全一致。
void __fastcall TMainForm::EABtnClick(TObject *Sender) {
try { EA->Connect(); } catch(...) { ShowMessage("Can not launch server"); }
EA->set_Caption(WideString("Excel Server Invoked by BCB"));
EA->set_Visible(0, true); // LocaleID=0
}
__fastcall TMainForm::~TMainForm() {
EA->set_DisplayAlerts(0, false); // 退出不彈確認框
EA->Quit();
}
關鍵點:Visible 必須用 set_Visible(LocaleID, value),直接屬性訪問編譯報錯。ConnectKind 建議 ckRunningOrNew。
// 新建
EWB->ConnectTo(EA->Workbooks->Add(TNP, 0));
// 打開現有文件(12 個可選參數多用 TNP)
EWB->ConnectTo(EA->Workbooks->Open(
WideString("c:\\temp\\test.xls"),
TNP, TNP, TNP, TNP, TNP, TNP, TNP, TNP, TNP, TNP, TNP, TNP, 0));
TNP = TNoParam() 宏,表示可選參數缺省。
// 連接三個默認工作表
EWS1->ConnectTo(EWB->Worksheets->get_Item(V("Sheet1")));
EWS2->ConnectTo(EWB->Worksheets->get_Item(V(2)));
EWS3->ConnectTo(EWB->Worksheets->get_Item(V("Sheet3")));
EWS3->Activate();
// 重命名
EWS1->set_Name(WideString(NewName));
// 移動 Sheet1 到 Sheet3 之後
EWS1->Move(TNP, V(EWB->Worksheets->get_Item(V("Sheet3"))), 0);
// 創建新工作表
EWS4->ConnectTo(EWB->Sheets->Add(TNP, V(EWB->Worksheets->get_Item(V("Sheet3"))), V(1), V(xlWorksheet)));
// 刪除
EWS2->Delete(0);
索引支持名稱("Sheet1")或序號(2)。V() = TVariant() 宏構造 Variant 參數。
#define TNP TNoParam()
#define V TVariant
這兩個宏極大簡化了 COM 參數構造代碼。