使用方法,把下面的RtpExcel中的RtpExcel.h段存成文件RtpExcel.h,
RtpExcel.c存成文件RtpExcel.c并保存,加入到C++Builder的工程中即可使用。
/*
RtpExcel.h
*/
//---------------------------------------------------------------------------
#ifndef RptExcelH
#define RptExcelH
#include <utilcls.h>
struct RptPageSetup
{
String sLeftHeader;
String sLeftFooter;
String sCenterheader;
String sRightHeader;
String sRightFooter;
String sCenterFooter;
};
struct RptInf
{
RptPageSetup RptPage;
String tTitle;
String tFirstRowL;
String tFirstRowR;
};
class CRptExcel
{
public:
CRptExcel();
~CRptExcel();
//从sBeginRow行开始设置数据并初始化边框
bool SetData(const RptInf& rInf,TDataSet* pSet);
bool PrintRpt();
private:
//初始化应用程序对象
bool InitApp();
//设置excel程序对象的可见性
bool SetAppVisible(bool bVisible);
private:
bool SetCellBorder();
bool SetInfTable();
bool SetInfCom();
bool SetTitle();
bool SetTopRow();
bool SetCellValue();
bool NewWorkBook();
bool NewExcelApp();
private:
TDataSet *m_pSet;
Variant m_ExcelApp;
Variant m_Sheet;
Variant m_WorkBook;
Variant m_Range;
unsigned int m_RowLast;
unsigned int m_RowBegin;
char m_cBegin;
char m_cEnd;
unsigned int m_RowCount;
unsigned int m_ColCount;
String m_sTitle;
String m_sCompanyInf;
String m_sA3Content;
String m_sLastCol3Content;
bool m_bAppRun;
private:
String m_sError;
};
//---------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------
/*
RptExcel.c
*/
#include <vcl.h>
#pragma hdrstop
#include "Excel_2K_SRVR.h"
#include "RptExcel.h"
CRptExcel::CRptExcel()
{
m_pSet=NULL;
m_bAppRun=false;
}
CRptExcel::~CRptExcel()
{
if(m_bAppRun)
{
m_ExcelApp.OleFunction ("Quit");
}
}
bool CRptExcel::PrintRpt()
{
if(!InitApp()) return false;
if(!SetCellValue()) return false;
if(!SetCellBorder()) return false;
if(!SetTitle()) return false;
if(!SetInfCom()) return false;
if(!SetInfTable()) return false;
if(!SetTopRow()) return false;
SetAppVisible(true);
return true;
}
bool CRptExcel::InitApp()
{
if(!NewExcelApp()) return false;
if(!NewWorkBook()) return false;
return true;
}
bool CRptExcel::NewExcelApp()
{
try
{
m_ExcelApp = Variant::CreateObject("excel.application");
m_bAppRun=true;
}
catch(...)
{
m_sError="不能初始化Excel应用程序对象!";
return false;
}
return true;
}
bool CRptExcel::NewWorkBook()
{
Variant all_workbooks;
//-- Get workbooks collection
all_workbooks = m_ExcelApp.OlePropertyGet("Workbooks");
//-- Set number of worksheets to 1
m_ExcelApp.OlePropertySet("SheetsInNewWorkbook",(Variant)1);
//-- Create a new workbook
m_WorkBook=all_workbooks.OleFunction("Add");
m_Sheet=m_WorkBook.OlePropertyGet("ActiveSheet");
return true;
}
bool CRptExcel::SetAppVisible(bool bVisible)
{
m_ExcelApp.OlePropertySet("Visible",(Variant)bVisible);
return true;
}
//得到m_cEnd,m_cBegin;m_RowLast;m_RowBegin;的值
bool CRptExcel::SetData(const RptInf& rInf,TDataSet* pSet)
{
m_ColCount=pSet->FieldCount;
m_cBegin='A';
m_cEnd='A'+m_ColCount;
m_RowBegin=4;
m_RowCount=pSet->RecordCount;
m_RowLast=m_RowBegin+m_RowCount;
m_pSet=pSet;
m_sTitle=rInf.tTitle;
m_sA3Content=rInf.tFirstRowL;
m_sLastCol3Content=rInf.tFirstRowR;
m_sCompanyInf=rInf.RptPage.sLeftHeader;
return true;
}
bool CRptExcel::SetCellValue()
{
char ctemp,cEnd;
int iRow,iRowLast;
unsigned int index;
Variant cell;
String str;
if(!m_pSet)
{
m_sError="没有设置数据集!";
return false;
}
if(m_pSet->Eof&&m_pSet->Bof)
{
m_sError="数据集为空";
return false;
}
if(m_ColCount<=0)
{
m_sError="列数读取出错!";
return false;
}
ctemp='A';iRow=4;
for(index=0;index<m_ColCount;index++)
{
ctemp='A'+index;
str.sprintf("%c%d",ctemp,iRow);
cell=m_Sheet.OlePropertyGet("Range",str);
str=m_pSet->Fields->Fields[index]->FieldName;
cell.OlePropertySet("Value",str);
if(ctemp=='Z')
{
m_sError="列数太多出错";
return false;
}
}
iRow++;ctemp='A';
m_pSet->First();
while(!m_pSet->Eof)
{
for(index=0;index<m_ColCount;index++)
{
ctemp='A'+index;
str.sprintf("%c%d",ctemp,iRow);
cell=m_Sheet.OlePropertyGet("Range",str);
str=m_pSet->Fields->Fields[index]->AsString;
cell.OlePropertySet("Value",str);
}
iRow++;
m_pSet->Next();
}
return true;
}
bool CRptExcel::SetTitle()
{
String str;
char ct;
str.sprintf("%c%d:%c%d",'A',1,('A'+m_ColCount),1);
Variant vCell;
try
{
vCell=m_Sheet.OlePropertyGet("Range",str);
vCell.OlePropertySet("Value",m_sTitle);
}
catch(...)
{
m_sError="设置表头信息时出错!";
return false;
}
return true;
}
//设置公司的信息到页眉页脚处
bool CRptExcel::SetInfCom()
{
try{
Variant PageHeader=m_Sheet.OlePropertyGet("PageSetup");
PageHeader.OlePropertySet("RightHeader","&D ");
PageHeader.OlePropertySet("LeftHeader",m_sCompanyInf);
}
catch(...)
{
m_sError="设置页眉信息时出错!";
return false;
}
return true;
}
bool CRptExcel::SetInfTable()
{
try{
Variant PageHeader=m_Sheet.OlePropertyGet("PageSetup");
PageHeader.OlePropertySet("RightFoot","&P/&N");
PageHeader.OlePropertySet("LeftFoot",m_sTitle);
}
catch(...)
{
m_sError="设置表头信息时出错!";
return false;
}
return true;
}
bool CRptExcel::SetTopRow()
{
try{
Variant vCell=m_Sheet.OlePropertyGet("Range","A3");
vCell.OlePropertySet("Value",m_sA3Content);
String str;
str.sprintf("%c3",'A'+m_ColCount);
vCell.OlePropertyGet("Range",str);
vCell.OlePropertySet("Value",m_sLastCol3Content);
}
catch(...)
{
m_sError="设置表头信息时出错!";
return false;
}
return true;
}
bool CRptExcel::SetCellBorder()
{
String str;
char ct='A';
for(unsigned int index=m_RowBegin;index<m_RowLast+1;index++)
{
for(unsigned int j=0;j<m_ColCount;j++)
{
ct='A'+j;
Variant vCell,vBorder;
try{
str.sprintf("%c%d",ct,index);
vCell=m_Sheet.OlePropertyGet("Range",str);
vCell.OlePropertyGet("Borders").OlePropertySet("linestyle",xlContinuous);
if(j==0)//对第一列的单元格设置其左边界为粗
{
vBorder=vCell.OlePropertyGet("Borders",xlEdgeLeft);
vBorder.OlePropertySet("linestyle",xlContinuous);
vBorder.OlePropertySet("weight",xlThick);
}
if(j==m_ColCount-1)//the Right Edge of last col
{
vBorder=vCell.OlePropertyGet("Borders",xlEdgeRight);
vBorder.OlePropertySet("linestyle",xlContinuous);
vBorder.OlePropertySet("weight",xlThick);
}
if(index==m_RowBegin)//the first row having data
{
vBorder=vCell.OlePropertyGet("Borders",xlEdgeTop);
vBorder.OlePropertySet("linestyle",xlContinuous);
vBorder.OlePropertySet("weight",xlThick);
}
if(index==m_RowLast)
{
vBorder=vCell.OlePropertyGet("Borders",xlEdgeBottom);
vBorder.OlePropertySet("linestyle",xlContinuous);
vBorder.OlePropertySet("weight",xlThick);
}
}
catch(...)
{
m_sError="设置边框时出错!";
return false;
}
}
}
return true;
}
//---------------------------------------------------------------------------
#pragma package(smart_init)