摘 要: 常用开发工具的报表设计工具操作繁琐,专业性强,难满足用户自己随时定制
报表格式的要求。本文基于Word模板,用VC建立一个通用的ActiveX报表控件,用以补充开
发工具中报表处理功能的不足。
关键词:报表控件,OLE自动化,定制报表,ActiveX控件
1 引言
信息管理系统的常用开发工具(如VFP、DELPHI、POWERBULID等)的报表设计工具操作
繁琐,专业性强,当用户对报表的需求有所变化时,需重新修该应用程序。特别对一些突
发性的临时报表的需求,更是无能为力。
为了制作复杂报表及赋予用户定制报表的能力,就需要对常用的开发工具扩充以提供一
种灵活的报表设计工具,当前ActiveX控件可用于大多数开发环境,是扩充开发工具报表
开发能力的首选。本文介绍一种基于WORD模板的报表ActiveX控件,该控件基于报表模板生
成WORD文档形式的报表,以供用户或应用程序打印或预览。用户可通过修改报表模板以改
变报表格式。
本文介绍本控件所实现三类报表中第一类报表(即数据源中每行数据生成一个报表)
的实现。报表的数据源采用EXCEL,当然为了扩充,我把对数据源的访问封装在两个函数
上即取属性名函数及取数据源特定行的函数内,这样能通过ADO方便的转换到其他数据源。
2 报表模板的设计
2.1 根据要求在WORD中设计好报表的格式 。
2.2 在设计好报表中,添加数据项的描述。
数据项的描述定义采用WORD标签,即在报表中需要输出数据源中的数据的位置插入标签。
标签名即数据源的属性名(对EXCEL第一行上各列单元格的值即为属性名)。
3 控件的实现
在VC++ 6.0下创建Activex控件
3.1建立工程
MFC Activex ControlWizard新建一个名为report的工程,在向导过程中选取
invisible at runtime 的特征。打开ClassWizard ---Add Class---From a type library
选择本机的Word9.olb(本机装Word2000,Word98中为Word8.olb 具体根据本机word的
版本)。选择_Application (类名改为_Applicationword),_Document,Documents ,
Bookmark,Bookmarks,Cell,Cells,Column,Columns ,Range(类名改成Rangeword),
Row,Rows,Selection,Table,Tables,Window,Characters,Paragraph,Paragraph,
View。加入新类。用同样方法选择本机的EXCEL9.OLB,选择_Application,_Workbook,
Workbooks ,_Worksheet,Sheets,Range加入新类。
在ReportCtl.h中加入
#include "excel9.h"
#include
#include "msword9.h"
3.2增加ActiveX控件属性:
1.文档模板文件名:ReportTemplateFileName类型Cstring 内部名 m_reportTemplateFileName
2.数据源名: DateSourceName 类型 BSTR 内部名 m_DateSourceName;
3. 添加报表种类属性
(1)定义枚举类型:在CreportCtrl类的定义中加入
enum ReportType {OneRecordOneReport=1,OneGroupRecordOneReport, OneTableOneReport};
//每条记录一张报表,每组记录一张报表,所有记录一张报表 (2)添加报表种类属性 ReportType 类型 short 内部名 m_ReportType
4.添加报表文件名属性ReportFileName 类型 Cstring 内部名称 m_reportFileName
5.添加报表特征属性
(1)定义枚举类型enum ReportCharacter
{EveryReportPageAlone=0x0001,VerticalAjacentCellUnite=0x0002,Group=0x0004,
EveryPageHasHeadTail=0x0008 ,EveryPageHasTailNoHead=0x0010 };
//对第一类报表仅第一个用到,即一页能不能包含多张报表 (2)定义报表特征属性 ReportCharacter 类型 short 内部名称 m_ReportCharact
6.添加文件路径属性 FilePath 类型 Cstring 内部名m_filePath
7.添加数据源主属性属性 DataSourceKey 类 Cstring 内部名m_DateSourceName
多个主属性以,分开。
3.3 添加报表控件的报表制作方法及相关的私有函数及数据
3.3.1报表制作方法MakeReport
short CReportCtrl::MakeReport()
{
/*检查 数据源文件、报表文件、报表模板文件文件名的合法性及数据源文件、报表
模板文件及文件路径是否存在------从略*/
int pronum=GetDataSourceProperty(DataSourceProperty); /*启动excel服务,
读数据源的属性名到数组DataSourceProperty 返回 –1表示 启动EXCEL服务失败*/
if(pronum==-1){m_ErrorinformationCode=7; EndExcel();return 7;}
/* m_ErrorinformationCode是类的私有成员,保存制表后的错误代码 错误信息
在类的一个常量字符串数组中-----从略*/
if(!DataSourceKeyIsExist()){m_ErrorinformationCode=6; return 6;}
//检查关键字属性存在否
switch(m_ReportType)
//报表类型
{ case OneRecordOneReport:if(OneRecordOneReportMakeReport()==-1)
{m_ErrorinformationCode=11; return 11; };
break; }
//对DataSourceProperty 等字符串数组删除数组内的所有串 /对pDataSourcePropertyKeySN等指针变量释放空间-----从略
EndExcel();
//结束Excel服务
return 0;
}
3.3.2添加私有数据
_Application excel;Workbooks books;_Workbook book;Sheets sheets;
_Worksheet worksheet;
CstringArray DataSourceProperty ,DataSourcePropertyKey ;
/*存放数据源的属性名,数据源的关键字 */
int * pDataSourcePropertyKeySN;//关键字属性对应的excel表的列数从一开始
3.3.3 添加的CreportCtr类的部分私有函数
1.从串中分解出子串(以,为分界)同时去除空格,返回子串数
int ExtractSubtring(Cstring &str,CstringArray &strarr)//实现从略
2.取excel指定行 返回false表示全空 n 表示第几行 SpaceEndOrAppointCol=0
表示该行从左到右查找,如碰到属性为空则表示该行结束 否则SpaceEndOrAppointCol
表示该行的列数*/
bool CReportCtrl::GetExcelRowToArray(int n, CStringArray &prostrarr,
int SpaceEndOrAppointCol)
{if(SpaceEndOrAppointCol
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?