BCB中Excel的操作(二)

TR@SOE 2008-08-29 08:48:03
在本文中,我们继续讨论在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的介绍就此打住。希望给大家一些帮助。
...全文
441 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
我来看看CB 2008-09-02
  • 打赏
  • 举报
回复
好好
truelove7283159 2008-09-01
  • 打赏
  • 举报
回复
老大你传道授业解惑,小弟我来膜拜学习:)

604

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder VCL组件使用和开发
社区管理员
  • VCL组件使用和开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧