BCB中Excel的操作(二)
在本文中,我们继续讨论在BCB 6中开发Office(主要是Excel)程序的心得。
(四) 单元格的操作
单元格的操作实际上就是对范围(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控件中是独立的,图标为:ExcelChart控件。操作它的代码一般如下:
void __fastcall TMainForm::DrawBtnClick(TObject *Sender)
{
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,图标是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的介绍就此打住。希望给大家一些帮助。