C++Builder操作Excel
在实际⼯作中经常⽤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("Cell
s",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;getsavefilename
}
Application->MessageBox("成功完成报表保存!\n可以按\'打开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;
}
}
  ⾄此,完成报表数据的写⼊⼯作。如果要对完成的Excel表进⾏操作,可以点击"打开Excel表⽂件按钮"(ReadButton),进⾏修改,保存,打印等操作。ReadButton的单击事件如下实现:
void __fastcall TForm1:: ReadButtonClick(TObject *Sender)
{
try
{
file://指定report⽬录下的报表⽂件⽤于⽤户操作
AnsiString ExcelFileName =
GetCurrentDir();+"\\report\\table.xls";
if(!FileExists(ExcelFileName))
{
Application->MessageBox("Excel表⽂件不存在,⽆法打开!",
"错误",MB_ICONSTOP|MB_OK);
return;
}
try
{
Ex = Variant::CreateObject("Excel.Application");
}
catch(...)
{
Application->MessageBox("⽆法启动Excel","错误",MB_ICONSTOP|MB_OK);
return;
}
file://使Excel可见
Ex.OlePropertySet("Visible",true);
file://打开Excel表格⽂件Table.xls
Ex.OlePropertyGet("WorkBooks").OleProcedure("Open",ExcelFileName.c_str()); }
catch(...)
{
Application->MessageBox("操作Excel表格错误!","错误",MB_ICONSTOP|MB_OK); Ex.OleFunction("Quit");
}
}
ole excel操作
Variant ex,wb,sheet,range;
ex=CreateOleObject("Excel.Application");//创建应⽤对象
ex.OlePropertySet("Visible",true);//显⽰excel
ex.OlePropertyGet("Workbooks").OleProcedure("Add"); // ⼯作表
wb=ex.OlePropertyGet("ActiveWorkBook");//创建⼯作簿对象
sheet=wb.OlePropertyGet("ActiveSheet");
1、增加 sheet:
wb.OlePropertyGet("Sheets").OleFunction("Add", "Sheet4");
2、sheet 重新命名:
由于:sheet 的名称获取采⽤ sheet.OlePropertyGet("Name");
因此:sheet 的名称设置采⽤ sheet.OlePropertySet("Name", "优化前的电压");

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。