程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ Builder 6中開發Office程序心得(二)

C++ Builder 6中開發Office程序心得(二)

編輯:關於C++

(四) 單元格的操作

單元格的操作實際上就是對范圍(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的介紹就此打住。希望給大家一些幫助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved