<b>在C++ Builder顶用Ole掌握Excel表</b>[VC/C++编程]
本文“<b>在C++ Builder顶用Ole掌握Excel表</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
笔者在实际工作中常常用Excel表做数据报表,大大都表格的数据都要从数据库中读取,这样我就用C++Builder做了一个报表程序,便利了很多,目前把它同享给C++Builder爱好者们,就算为丰富C++Builder的文档资料做点事情吧.
首先把Excel报表文件保存到一个指定目录下,最好放在可执路程序的子目录下,作为模板文件.可以把报表标题、表头等设置好.这里是保存在trpt子目录下.
然后建一个report目录,作为报表目标文件夹,存放填好数据的报表,可以由用户直接操作.
首先肯定在你的机械中装有Office.这里一Office2000为例.
在C++Builder中新建一个工程,在窗体Form1上面放一个两个按钮SaveButton和ReadButton,辨别用来保存数据到Excel表和显示方才保存的Excel表.
在SaveButton按钮的单击事件中把从数据库中取到的数据放入到指定的Excel表中并将改文件拷贝到report目录下.在ReadButto按钮的单击事件中显示report目录下的报表文件,便操纵户改正和别的保存.
在Form1.h头文件中定义几个变量:
private:
Variant Ex,Wb,Sheet,ERange,EBorders;
并在文件头中包含以下语句:
#include "Excel_2K_SRVR.h"
#include
在Form1.cpp的文件头中加入
#pragma link "Excel_2K_SRVR"
主要代码以下:
void __fastcall TForm1:: SaveButtonClick(TObject *Sender)
{
try
{
SaveButton->Enabled = false;
ReadButton->Enabled = false;//使两个按钮无效
file://取报表文件CardSend.xls的完好目录名
AnsiString ExcelFileName = GetCurrentDir()+"\trpt\table.xls";
if(!FileExists(ExcelFileName))
{
Application->MessageBox("报表模板文件不存在,无法翻开!",
"错误",MB_ICONSTOP|MB_OK);
return;
}
file://成立Excel的Ole对象Ex
try
{
Ex = Variant::CreateObject("Excel.Application");
}
catch(...)
{
Application->MessageBox("无法启动Excel","错误",MB_ICONSTOP|MB_OK);
return;
}
file://设置Excel为不可见
Ex.OlePropertySet("Visible",false);
file://翻开指定的Excel报表文件.报表文件中最好设定只有一个Sheet.
Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",ExcelFileName.c_str());
Wb = Ex.OlePropertyGet("ActiveWorkBook");
Sheet = Wb.OlePropertyGet("ActiveSheet");//获得当前默许的Sheet
file://清空Excel表,这里是用循环清空到第300行.关于普通的表格已经充足了.
AnsiString strRowTemp;
AnsiString strRange;
int iCols,iRows;//记录列数和行数
/*从第三行开始,到第300行止.普通第一行是表标题,第二行是副标题大概制表日期.*/
for(iRows=3;iRows<300;iRows++)
{ file://假定只有6列.
for (iCols = 1;iCols < 7; iCols++)
{
file://清空行
Sheet.OlePropertyGet("Cells",iRows,iCols).OlePropertySet("Value","");
}
file://去掉表格边框
strRange = "A"+IntToStr(iRows)+":F"+IntToStr(iRows);//获得操作范围
ERange = Sheet.OlePropertyGet("Range",strRange.c_str());
EBorders = ERange.OlePropertyGet("Borders");//获得边框对象
EBorders.OlePropertySet("linestyle",xlNone);
}
AnsiString strPtrDate; file://存放当前日期,作为制表日期
DateSeparator = '-';
ShortDateFormat = "yyyy/m/d";//设置为年/月/日格局
strPtrDate = DateToStr(Date());//取当前日期
AnsiString strYear = strPtrDate.SubString(1,4);
strPtrDate = strPtrDate.SubString(6,strPtrDate.Length()-5);
AnsiString strMonth = strPtrDate.SubString(1,strPtrDate.Pos("-")-1);
AnsiString strDay =
strPtrDate.SubString(strPtrDate.Pos("-")+1,
strPtrDate.Length()-strPtrDate.Pos("-"));
strPtrDate = strYear+"年"+strMonth+"月"+strDay+"日";
AnsiString strData = "报表标题";//报表标题
file://将报表标题置于第一行第一列.在此之前,应将报表文件的标题格局设定好.
Sheet.OlePropertyGet("Cells",1,1).OlePropertySet("Value",
strData.c_str());
file://将制表日期置于表格第二行的右侧.
Sheet.OlePropertyGet("Cells",2,5).OlePropertySet("Value",
strPtrDate.c_str());
iRows = 3;//在第三行安排表格的列名
Sheet.OlePropertyGet("Cells",iRows,1).OlePropertySet("Value","列名1");
Sheet.OlePropertyGet("Cells",iRows,2).OlePropertySet("Value","列名2");
Sheet.OlePropertyGet("Cells",iRows,3).OlePropertySet("Value","列名3");
Sheet.OlePropertyGet("Cells",iRows,4).OlePropertySet("Value","列名4");
Sheet.OlePropertyGet("Cells",iRows,5).OlePropertySet("Value","列名5");
Sheet.OlePropertyGet("Cells",iRows,6).OlePropertySet("Value","列名6");
file://画表格边框,在A3:F3之间取范围
strRange = "A"+IntToStr(iRows)+":F"+IntToStr(iRows);
ERange = Sheet.OlePropertyGet("Range",strRange.c_str());
EBorders = ERange.OlePropertyGet("Borders");
EBorders.OlePropertySet("linestyle",xlContinuous);
EBorders.OlePropertySet("weight",xlThin);
EBorders.OlePropertySet("colorindex",xlAutomatic);
iRows++;
file://从数据库中取数据(略),假定数据集放入Query1中.
Query1->Open();//翻开数据集
file://循环取数
while(!Query1->Eof)
{
file://循环取字段的数据放到Excel表对应的行列中
for(iCols=1;iCols<7;iCols++)
{
strRowTemp = Query1->Fields->Fields[iCols-1]->AsString;
Sheet.OlePropertyGet("Cells",iRows,iCols).OlePropertySet("Value",
strRowTemp.c_str());
}
file://画该行的表格边框
strRange = "A"+IntToStr(iRows)+":F"+IntToStr(iRows);
ERange = Sheet.OlePropertyGet("Range",strRange.c_str());
EBorders = ERange.OlePropertyGet("Borders");
EBorders.OlePropertySet("linestyle",xlContinuous);
EBorders.OlePropertySet("weight",xlThin);
EBorders.OlePropertySet("colorindex",xlAutomatic);
iRows++;
Query1->Next();
}//while完毕
Wb.OleProcedure("Save");//保存表格
Wb.OleProcedure("Close");关闭表格
Ex.OleFunction("Quit");退出Excel
file://定义目标文件名
AnsiString DestinationFile =
GetCurrentDir()+"\report\table.xls";
file://将方才改正的Excel表格文件table.xls拷贝到report目录下
if(!CopyFile(ExcelFileName.c_str(),DestinationFile.c_str(),false))
{
Application->MessageBox("复制文件操作失利,Excel文件大概正在利用中!",
"错误",MB_ICONSTOP|MB_OK);
return;
}
Application->MessageBox("成功完成报表保存!
可以按'翻开Excel文件'
按钮举行报表工作","提醒",MB_ICONINFORMATION|MB_OK);
SaveButton ->Enabled = true;
ReadButton ->Enabled=true;
}//try完毕
catch(...)
{
Application->MessageBox("操作Excel表格失利!",
"错误",MB_ICONSTOP|MB_OK);
Wb.OleProcedure("Close");
Ex.OleFunction("Quit");
SaveButton ->Enabled = true;
ReadButton ->Enabled=false;
}
}
以上是“<b>在C++ Builder顶用Ole掌握Excel表</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |