C++ Builder 6中开拓Office措施心得(二)
副标题#e#
(四) 单位格的操纵
单位格的操纵实际上就是对范畴(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列的宽度无法自动适应图片的宽度,需要别的调理。
#p#副标题#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的先容就此打住。但愿给各人一些辅佐。