Excel 自動化核心是 Range 物件。寫入單元格三步驟:
RangePtr r = EWS4->get_Range(V("A1"), V("A1")); // 1. 獲取範圍
r->set_Value(V("Species No")); // 2. 設置值
批量寫入同理,先獲取區塊範圍再賦值。數據庫導出本質是遍歷記錄集逐單元格寫入,速度較慢。
r = EWS4->get_Range(V(CellRef), V(CellRef2));
r->Font->set_Name(V("Arial")); // 字體
r->get_Columns()->AutoFit(); // 自動列寬
r->set_WrapText(V(true)); // 自動換行
Excel 無直接圖片寫入 API,需借助剪貼板:
Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
Bitmap->Assign(Table1Graphic); // 1. 數據集圖形字段 → Bitmap
unsigned int DataHandle; HPALETTE APalette; unsigned short MyFormat;
Bitmap->SaveToClipboardFormat(MyFormat, DataHandle, APalette); // 2. Bitmap → 剪貼板格式
Clipboard()->SetAsHandle(MyFormat, DataHandle); // 3. 放入系統剪貼板
EWS4->Paste(V(LPDISPATCH(r)), TNP, 0); // 4. 粘貼到 Range 位置
注意:Paste 只定位左上角,圖片不會自適應單元格,列寬需單獨調整。
RangePtr r = EWS4->get_Range(V("B1"), V("C" + IntToStr(Count-1)));
EC->ConnectTo(EWB->Sheets->Add(TNP, TNP, V(1), V(xlChart), 0)); // 創建圖表頁
EC->set_ChartType(xlColumnClustered); // 簇狀柱狀圖
EC->SetSourceData(r, V(xlColumns)); // 數據源
EC->ChartTitle[0]->set_Caption(L"Animal Data Report");
EC->set_Name(L"Animal Data Chart");
EC->set_HasDataTable(true); // 顯示數據表
EC->set_HasLegend(0, false); // 隱藏圖例
遺留問題:X/Y 軸標題設置運行時報錯,作者轉向 Interop 開發未深究。
逐單元格寫入極慢,TExcelQueryTable 直接從數據庫批量填充:
EWS1->Activate();
String ConnStr = "ODBC;DSN=testdbf;UID='';PWD=''";
String SQL = "SELECT * FROM animals";
RangePtr R = EWS1->get_Range(V("A1"), V("A1"));
EQT->ConnectTo(EWS1->QueryTables->Add(V(ConnStr), R, V(SQL)));
EQT->Refresh(); // 一次性填充所有數據
三要素:連接字符串、SQL 查詢、起始單元格。速度提升顯著,適合報表導出場景。
BCB6 Server 控件提供強類型、OO 風格封裝,優於 OLE Automation 弱類型調用。掌握 Excel 宏記錄、VBA 帮助、BCB 頭文件三大查閱途徑,事半功倍。