标题:在C++ Builder中用Ole控制Excel表
只看楼主
pineyer
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2004-4-23
 问题点数:0 回复次数:2 
在C++ Builder中用Ole控制Excel表

时间: 2004.4.25 20:25:58 标题: (转贴)在C++ Builder中用Ole控制Excel表

-------------------------------------------------------------------------------- 在C++ Builder中用Ole控制Excel表

2003-02-13· ·姜宏华 ··yesky   笔者在实际工作中经常用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("成功完成报表保存!\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"); } }

搜索更多相关主题的帖子: Builder Excel表 Ole 数据库 
2004-04-27 10:58
C++大粉丝
Rank: 4
等 级:贵宾
威 望:10
帖 子:477
专家分:0
注 册:2004-4-23
得分:0 

不错~~就是还有些地方需要再推敲一下~~

帮你顶~~~~~~~~~~~~~


I am a big fan of c plus plus.
2004-04-27 11:02
djcad06
Rank: 1
等 级:新手上路
帖 子:3
专家分:1
注 册:2010-5-25
得分:0 
一点点学吧
2010-05-25 22:57



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-927-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.021134 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved