(四) 單元格的操作
單元格的操作實際上就是對范圍(Range)的操作。一般的代碼段如下:
RangePtr r;
r=EWS4->get_Range(V("a1"), V("a1"));
r->set_Value(V("Species No"));
所以,對單元格內容的操作實際就是先獲得一個要操作的范圍(Range),然後再set_Value的過程。
和數據庫連接並不很困難。將數據庫中的數據寫到Excel Worksheet中也不是很難,無非是遍歷數據集,然後將對應字段的內容寫到相應的單元格裡去而已,所以這裡我就不詳細論述了。公式的輸入也是如此。
實際操作的效果如下圖:
這裡需要說明兩個地方。第一是字體和欄目寬度的調整。具體的代碼如下:
r=EWS4->get_Range(V(CellRef), V(CellRef2));
r->Font->set_Name(V("Arial"));
r->get_Columns()->AutoFit();
r->set_WrapText(V(true));
其操作流程也是先選擇一個范圍,然後設置字體名稱、欄目寬度、自動換行等。
第二是圖形的顯示。這需要多一些操作才可以:
void __fastcall TMainForm::FillDataBtnClick(TObject *Sender)
{
unsigned int DataHandle;
HPALETTE APalette;
unsigned short MyFormat;
Graphics::TBitmap *Bitmap = new Graphics::TBitmap();
... ...
while (!Table1->Eof)
{
... ...
CellRef="e"+IntToStr(Count);
r=EWS4->get_Range(V(CellRef), V(CellRef));
Bitmap->Assign(Table1Graphic);
Bitmap->SaveToClipboardFormat(MyFormat,DataHandle,APalette);
Clipboard()->SetAsHandle(MyFormat,DataHandle);
EWS4->Paste(V(LPDISPATCH(r)), TNP, 0);
... ...
}
... ...
delete Bitmap;
return;
}
這裡采用了Bitmap->Assign,將圖形字段的內容作為Bitmap的內容,然後將Bitmap以剪貼板的格式保存到DataHandle中去,並返回保存的格式到MyFormat。然後用Clipbboard的SetAsHandle方法,將DataHandle中的內容以MyFormat格式“拷貝”到剪貼板上。最後,再用Worksheet的Paste方法將剪貼板上的圖片拷貝到r指定的地方。
注意,r只是指明了被拷貝內容左上角的位置。對於圖片來說,它不會、也不應該自動適應到一個單元格中。所以,在上述例子中,E列的寬度無法自動適應圖片的寬度,需要另外調節。
(五) 根據數據繪制圖形
圖形在Office Server控件中是獨立的,圖標為:。操作它的代碼一般如下:
void __fastcall TMainForm::DrawBtnClick(TObject *Sender)
// 本文轉自 C++Builder研究 - http://www.ccrun.com/article.asp?i=1045&d=6375g6
{
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));
//Set Titles
EC->ChartTitle[0]->set_Caption((WideString)"Animal Data Report");
EC->set_Name((WideString)"Animal Data Chart");
EC->set_HasDataTable(true);
EC->set_HasLegend(0,false);
}
這裡的ChartType可用的enum變量可以在幫助文件中獲得。在這裡,我碰到了難題。因為我不知道如何設置X/Y軸的標題。雖然我可以編寫代碼使編譯通過,但是在運行時一定出錯。我已經無計可施,也不想繼續下功夫了——因為我想轉換到Interop下去編程。
(六) 使用TExcelQueryTable
(四)中介紹的將數據庫中的數據導入Excel Worksheet的方法是很慢的。第一,遍歷數據集很花費時間;第二,頻繁的對單元格進行操作也很花時間。所以,需要用一個改進了的控件來加快大量數據的導入。
這個控件就是TExcelQueryTable,圖標是。其典型代碼如下:
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
String ConnStr;
RangePtr R;
String SQL;
EWS1->Activate();
ConnStr="ODBC;DSN=testdbf;UID='';PWD=''";
SQL="select * from animals";
R=EWS1->get_Range(V("a1"), V("a1"));
EQT->ConnectTo(EWS1->QueryTables->Add(V(ConnStr), R, V(SQL)));
EQT->Refresh();
}
使用ExcelQueryTable要至少三個參數。
ConnectionString。它用來連接到一個數據庫。在上例中我采用的是ODBC方式。用OLE DB也是可以的。
SQL。它用來返回一個記錄集。
Range。它指定了記錄集從哪個單元格開始填充。從左到右各列將代表記錄集的字段;從上到下就是各個記錄。
用這個方式填充大量數據,可以大幅度的提升速度。
關於用BCB 6操作Excel的介紹就此打住。希望給大家一些幫助。