您当前的位置: 首页 >  c++

phymat.nico

暂无认证

  • 6浏览

    0关注

    1967博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

用VC++实现通用的报表控件

phymat.nico 发布时间:2015-01-23 11:22:12 ,浏览量:6

摘 要: 常用开发工具的报表设计工具操作繁琐,专业性强,难满足用户自己随时定制 报表格式的要求。本文基于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
关注
打赏
1659628745
查看更多评论
立即登录/注册

微信扫码登录

0.0770s