delphi制作报表
- 格式:doc
- 大小:313.00 KB
- 文档页数:46
Delphi报表制作入门Delphi 7.0 中实现报表的方法称为 Rave。
Rave 报表是一种基于组件的可视化报表设计工具,使用它可以简化设计过程,提高设计效率。
只要将 Rave 报表组件添加到应用程序中后,就可以创建各种类型的报表。
本文将以 ADO 组件连接数据库,向读者介绍怎样利用 Rave Report5.0 快速设计报表。
还是赶快行动起来,体验一下 Rave Reports 的强大功能吧!1.准备好范例数据库,笔者使用 Access 建立数据库Student.mdb,创建一个表:StuInf(学生基本信息),包含Sno(学号),Sname(姓名),Sex(性别),Class(班级),Birthday(出生日期)... 等字段,所有字段名先使用括号中的中文;再写入几条数据备用。
2.启动Delphi7.0 建立一个工程,在窗体上放置一个ADOQuery 控件,设置其ConnectionString 属性,连接数据库 Student,设置 SQL 属性为“select * from StuInf;”,Active 属性为 True 。
为了能看到库中的数据,再往窗体上放置一个DBGrid 和一个 DataSource ,设置相关属性,使 DBGrid 中显示数据。
3.在窗体上添加一个 GroupBox,设置其 Caption 为“选择报表式样”;往其中添加两个 RadioButton ,Caption 分别为“条列形式”、“表格形式”;往窗体上添加一个按钮,Caption 为“显示报表”。
现在,准备工作已经完成了,保存工程,下面开始报表的设计。
4.在窗体上添加一个RvDataSetConnection组件,设置其DataSet为ADOQuery1,这样,就提供了 Rave 报表与数据源之间的连接。
5.在 Delphi 主菜单的 Tools 中选择 RaveDesigner 启动 Rave Reports5.0。
Delphi编程实现Excel报表自动生成和发布文章介绍如何使用Delphi 编程通过定义报表内容描述、Excel 模板文件和服务器描述文件实现Oracle 数据库和Excel 模板文件的数据交换,并以Ftp 方式自动发布到Web 数据发布平台。
标签:Delphi;Excel模板;报表定义;Ftp1 引言随着计算机应用技术的快速发展,Excel 电子表格的普及,工作中常常需要从不同的信息管理系統中查询统计数据并以Excel 表格方式展现报表。
由于行业或者业务部门需求的变化,导致报表格式、种类繁多。
一些复杂报表,需求在软件开发期间都无法明确,为了解决此类问题,采用了表格功能强大的Excel 作为报表模板,Delphi 程序根据报表数据定义动态填入数据,完成数据填充后以Ftp 方式上传填写完数据的文件到Web 数据发布平台,从而实现Excel 报表的自动生成和发布功能。
2 实现原理2.1 按照业务部门的需求,根据需要的报表格式,编辑好Excel报表模板文件;根据报表的数据内容和区域,编写好报表定义文件。
2.2 以报表定义文件文件名作为运行的参数,在操作系统下创建批处理命令,并可以根据实际需要把批处理加入操作系统的计划任务,实现按程序自动运行。
2.3 程序根据报表定义文件的描述,主要做如下操作:①读取指定的Excel 模板文件;②到指定的数据库服务器查询数据并填充Excel 模板文件;③以Ftp 方式上传生成好的Excel报表文件到FTP服务器。
3 实现过程描述3.1 报表定义文件采用可扩展标记语言(XML文件描述),主要内容描述如下:report nameD:\xxxx\template_xxx.xlsD:\xxxx\xxxxxx.xls1ftp server nameftp remote dir……database name1n1,n2,n3,n4select col1,col2,… from table_name…………在Delphi 中使用控件解析方法生成XML 文件接口框架代码,通过生成的接口单元读取XML 文件,主要代码如下:Var xmlReport:IXMLReportType;//定义报表定义文件变量……xmlReport := LoadReport(报表定义XML文件);//读取报表定义文件if length(trim(xmlReport.Ftpserver))>0 then //是否指定FTP上传服务器uplaodFile(xmlReport.output);//上传文件到Ftp服务器……3.2 服务器定义文件文件格式同报表定义文件,主要内容及描述如下:server name user/pwd@ip:port:sid……ftp server namexxx.xxx.xxx.xxx215000usernamepassword……Delphi 处理该文件方法同上,根据指定服务器名称取查找服务器子节点,主要代码如下://根据指定的FTP名称,取服务器定义文件中FTP 中节点for i := 0 to xmlServers.Ftp.ChildNodes.Count - 1 do beginif (trim(xmlServers.Ftp.server[i].Name)= trim(serverName))then begin result := xmlServers.Ftp.server[i];exit;end;end;3.3 采用第三方數据库控件ODAC 访问Oracle 数据库ODAC 全称Oracle Data Access Components,是Oracle 数据存取组件,直接使用Oracle 接口(OCI),在应用中建立连接可以使用ODAC Net 选项无需在客户机上安装Oralce 客户端,仅需TCP/IP 支持,本次开发中使用了TOraSession 和TOraQuery 两个控件,主要代码如下:if oraSession.Connected then oraSession.Close;//关闭数据库连接oraSession.ConnectString := getOracleServerNode (OracleServerNname).ConnectString;//修改连接字串,函数getOracleServerNode 返回变量Oracle 服务器节点;oraSession.Connect;//连接数据库;ToraQuery 的使用方法同Delphi 中TQuery;3.4 Oracle 数据集填充Excel 数据区域根据指定数据区域和SQL语句向Excel模板文件中填写数据,注意点:SQL 语句运行结果和指定数据区域要一一对应。
DELPHI报表的动态生成(Create Delphi Dynamic Report)摘要:本文主要介绍如何在DELPHI开发环境下动态生成报表,给出公用模块,并结合具体示例分析了实现的主要技术问题,给出解决这些问题的技术细节。
关键词:DELPHI报表、动态创建一、引言报表是数据库应用程序的重要部分,可是报表的生成也是数据库开发中最麻烦的一项工作。
报表格式复杂多样,一直是使程序员头疼的事。
DELPHI 在其3.0以后版本中加入了QUICKREPORT,使这种情形有所改变。
它的全部可视化编程以及设计和运行过程中都可以进行预览等特性给程序开发带来了很大的方便。
我们可以通过在应用程序设计阶段往窗体中添加报表控件,再与数据库表组件Ttable,查询组件Tquery等数据访问组件相关联,从而实现报表的预览与报表的输出。
但在许多应用程序中,程序员往往期望从静态或者动态生成的数据库表中动态提取所需数据,进而生成报表输出。
本文介绍的就是如何动态选择所需数据,动态生成报表的公用模块。
这种动态方式生成的报表更加灵活,也更加容易做到报表的格式统一。
动态报表主要是在程序运行阶段利用Creat方法动态创建控件,设置其Parent属性来设置其容器控件。
然后,在程序中根据所选择的数据库表中的数据字段的长度和数目,通过修改控件的大小和位置属性,来控制控件的大小和外观,如果该控件有事件,可直接把函数或过程名赋给它的相应事件名。
二、动态报表的实现下面结合一个具体实例来说明如何其实现的方法和技术。
1、基本思路数据来源,我们以DELPHI自带的DBDEMOS中的employee.db表为例,它共有6个字段。
在F_main主窗体中(如图一),可以自由选择所需要打印的字段。
它的主要控件及属性设置如下:①.Table1:Databasename设置为DEDEMOS,Tablename设置为employee.db②.Listbox1:显示所连数据库表中的全部字段③.Listbox2:用于选择所需报表输出的字段④.AddBitBtn:用于把所选择的字段名添加到Listbox2中⑤.DeleteBitBtn:用于把Listbox2中的字段名去掉⑥.PreviewBitBtn:用于报表的预览⑦.PrintBitBtn:用于报表的输出⑧.CloseBitBtn:用于关闭应用程序在F_report窗体中,放置了以下主要控件,并设置属性,以减少程序的篇幅:①.Table1:Databasename设置为DEDEMOS,Tablename设置为employee.db②.QuickRep1:papesize属性为A4,dataset属性为Table1,bands 属性中的hascolumnheader、hasdetail、hastitle设置为True显示数据库表中的全部字段在F_report的Oncreate事件中加入了如下代码:Table1.Open;if Table1.Active thenTable1.GetFieldNames(Listbox1.Items);// 获得数据库表中的全部字段名DeleteBitBtn.Enabled:=False; //在Listbox2中无字段时,DeleteBitBtn变灰2、从Listbox1中选择字段添加到Listbox2中为AddBitBtn的Onclick事件加入如下代码:if listbox1.Items.Count=0 then exit; //如Listbox1中无可供选择的字段,则执行空操作if listbox1.Selected[listbox1.ItemIndex] then //在Listbox1中选择字段beginListbox2.Items.Add(Listbox1.Items[Listbox1.ItemIndex]);//往Listbox2中增加选中的字段Listbox1.Items.Delete(Listbox1.ItemIndex);//从Listbox1中删除此字段if Listbox2.Items.Count>=1 then //在Listbox2中有字段才允许执行删DeleteBitBtn.Enabled:=True;end;3、从Listbox2中删除不需要的字段为DeleteBitBtn的Oncreate事件添加如下代码:if Listbox2.Items.Count=0 then exit; // 如果Listbox2中无字段,则执行空操作if listbox2.Selected[Listbox2.ItemIndex] then //在Listbox2中选择字段beginListbox1.Items.Add(Listbox2.items[Listbox2.itemindex]); //添加到Listbox1中Listbox2.Items.Delete(Listbox2.itemindex); //从Listbox2中删除此字段end;if Listbox2.Items.Count=0 then //如果Listbox2中无字段,则DeleteBitBtn变灰DeleteBitBtn.Enabled:=False;4、在报表中动态添加一列的步骤:①.TitleBand1中打印的是报表的名称,这里假设为:动态报表生成示例。
最近在做一个Delphi的发货清单的打印程序,其中涉及到需要计算清单的小计和总计的功能,文字难以表达清楚,上图吧:报表第一页的小计计算当前页面的商品价格总和,总计目前和小计一样是计算截止到当前页面的所有商品的金额和,下图为最后一页:这下大家明白了吧,就是要实现这样的报表。
废话不多说了,开始讲解我的思路:1.既然要计算小计,就是每页的金额和了,加入ReportMachine的计算文本框(TRMCalcMemoView),然后设置要汇总的字段值为数据字段“factSum”,然后选择计算文本框的属性面板中的“CalcOptions”选中“统计Brand”为要汇总的主项数据,统计类型为“合计(Sum)”,如图所示:2.最难的部分就是总计的计算,这不能简单的用计算文本框就能解决的,于是不得不用ReportMachine 的代码来处理,也就是在总计的文本框的OnBeforePrint事件中计算之前的小计文本框的值的和,然后赋值给总计文本框显示,先看下设计的报表:红色文字为两项总计的文本框的Name属性值。
下面是ReportMachine中自定义的OnBeforePrint事件函数代码如下:unit Report;varlValue,tValue: Double;//lValue=金额总计 tValue=税额总计procedure Memo1_OnBeforePrint(Sender: TObject);beginlValue:=lValue+CalcMemo1.CalcValue; //CalcMemo1为金额小计的文本框 TRMMemoView(Sender).Memo.Text := lValue;end;procedure Memo40_OnBeforePrint(Sender: TObject);begintValue:=tValue+CalcMemo2.CalcValue;//CalcMemo2为税额小计的文本框 TRMMemoView(Sender).Memo.Text := tValue;end;procedure Main;beginMemo1.OnBeforePrint:= Memo1_OnBeforePrint; //指定金额总计的文本框的OnBeforePrint事件的处理函数Memo40.OnBeforePrint:= Memo40_OnBeforePrint;//指定税额总计的文本框的OnBeforePrint事件的处理函数end;end.上面的代码先声明了两个事件函数用于计算两个累加的总计的值,然后赋值给相应的总计文本框;然后再Main中指定给总计文本框的事件,这样当打印总计之前先汇总赋值并打印。
delphi使⽤QuickReoprt⽣成报表1.添加报表控件1>点击菜单命令‘’Componet/Install Packages‘’2>在弹出的对话框,点击Add3>在delphi⽂件夹下-bin⽬录-选择dclqrt70.dpl⽂件,点击添加安装好之后,在控件⾯板上可以找到Qreport ⾯板。
2.添加QuickRep控件创建⼀个 QuickRep1 对象。
TQuickRep控件是设置报表的核⼼控件,相当于打印范围,是其他控件的⽗级。
3.添加Adoquery1 对象1>将 QuickRep1的 DataSet 属性设置为 Adoquery1。
2>在 Adoquery1 的 SQL 属性⾥添加SQL语句。
3>设置ADOQuery1的connectstring属性为,根据实际数据库进⾏更改:Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DB;Data Source=.4>设置ACtive属性为True。
4.添加标题栏,数据栏,统计信息栏1>在 QuickRep1 上添加 3 个对象:QRBand1、QRBand2 和 QRBand32>QRBand1 主要是作为表头来显⽰头部信息。
属性:BandType 设置为:rbPageHeader3>QRBand2 主要⽤来显⽰数据记录信息。
属性: BandType 设置为:rbDetail4>QRBand3 主要⽤来存放统计信息。
BandType 设置为:rbSummary5.在数据栏中添加QRDBText1(⽂本控件)⽤来显⽰数据库信息1>DataSet 属性设置为:ADOQuery1。
2>DataField属性设置为:所需要显⽰的数据库字段.6.在统计信息栏添加统计信息属性:Data 设置为:qrsDetailCount7.添加事件在对应的按钮事件中添加如下代码:Form1.QuickRep1.Preview ;。
在Delphi中实现数据分析模块的动态报表⼀、问题的提出Delphi作为强⼤的数据库开发⼯具,正被愈来愈多的编程⼈员所采⽤,"聪明的程序员⽤Delphi"更形象⽣动的道出⼴⼤程序员的⼼声,但这并不意味着所有功能的实现都⾮常容易,例如,笔者在开发军队的某个信息系统中,就在为数据分析模块中DecisionGrid1控件的数据进⾏报表输出时⾛了不少的弯路。
⼴⼤的Delphi的爱好者在今后的学习或⼯作中也有可能会遇到类似的问题,⽽在许多参考书中,很少有甚⾄没有关于它们的解决⽅法,于是,我想花费⼀点时间把它整理出来,以供⼤家参考。
本⽂中报表动态⽣成的公⽤模块具有很⼤的灵活性和易操作性,其中的思路、实现的功能和通⽤性等⽅⾯的优缺点就由⼤家看了本⽂后⾃有定论。
⼆、建⽴报表的动态输出公⽤模块下⾯,结合公司⼈事管理信息系统说明其实现的⽅法和技术。
1、基本思路:⾸先从DecisionGrid1中获得报表所需数据,放到⼆维数组PA中,然后在C:\DataWork中动态创建⼀个数据表tjb.dbf,存放报表数据,最后⽤T able1与tjb.dbf相连接,以后⼯作就与⼀般的动态输出报表(如查询报表)相类似,在这⾥我就⽆须赘述了。
2、建⽴窗体⽂件:放⼊六个⽤于数据分析的常⽤控件DecisionQuery1、DecisionSource1、DecisionCube1、DecisionGraph1、DecisionPivot1、DecisionGrid1,设置DecisionSource1的decisionCube属性为decisionCube1,decisionCube1的Dataset属性为decisionQuery1、decisionQuery1的DatabaseName属性为c:\datawork;⼀个Table1控件,⽤于连接数据表tjb.dbf;⼀个QuickRep1控件,⽤于数据的报表输出;两个Button1和Button2控件,其Caption分别设为"报表输出"和"返回"。
delphi fastreport 用法Delphi FastReport 用法Delphi 是一种强大的编程语言,它提供了快速开发应用程序的能力。
而 FastReport 是一个插件,能够为 Delphi 提供报表设计和生成功能。
本文将介绍 Delphi FastReport 的用法,包括报表设计、数据源使用、导出和打印等。
1. 报表设计打开 Delphi,创建一个新的项目,加入 FastReport 模块后,双击报表设计器,进入报表设计界面。
在左侧的工具栏中,有各种控件,如标签、文本框、图像等。
可以将这些控件拖到报表上,设置它们的属性,如字体、大小、颜色等。
2. 数据源使用在报表设计中,如何引用数据源呢?首先需要将数据源组件(如FIBPlus、IBX、ADO 等)添加到 Delphi 项目中。
然后,可以在报表设计器中找到 Data Tree 栏,在其中选择需要使用的数据源和数据表。
3. 报表导出在制作完报表后,需要将其导出为其他格式,比如 PDF、Excel、Word、HTML 等。
FastReport 在导出前,需要安装相关的导出 DLL 文件。
再使用 Export 模块,选择需要导出的文件格式,单击导出即可。
4. 报表打印制作好的报表导出后,还需要将其打印出来。
EasyPrint 模块为FastReport 提供了强大的打印功能。
首先需要在程序中载入EasyPrint 模块,并设置打印参数。
接着使用 Report.Print 方法,即可将报表打印出来。
总结:以上是 Delphi FastReport 的简单用法介绍,具体使用还需要根据实际情况进行调整。
同时,建议多多研究相关的 API 文档和示例代码,以加深对 FastReport 和 Delphi 的理解和掌握。
DELPHI制作复杂报表实例,特别推荐!我近段时间一直在做各种各样的报表,特别是那些复杂报表,如下图所示:像这类报表若说用第三方控件,说实在,你还得重做一次表,你做的又不一定符合人家原来做的要求,若用用友软件,那得交一笔不小的数目的钱哦!可我们公司一直要求以最小的投入获取最大的回报,所以是不可能的,后面想想,他们是用EXCEL做成的表给我的,我为什么不可以直接调用它们的表呢,我只要把这些表做成模板再与数据库相连,便可实现了,后来就按这方案去进行了,结果当然是搞定了,现在公布出来与大家共享,当然,对与高手而言也许不是怎么高的水平,但我相信会对部分人有用的,像这类报表做的思想就是:!一.定义各类数据的行列;二,连接模板;三,按要求进行相关的数据提取和相关的运算,对于数据运算一定要尽量想到EXCE 的强大的运算功能,只要它能帮解决的就不要程序里面编写,否则运行起来就不是那么快了,相关代码如下:procedure Tdp_bb.dp_okClick(Sender: TObject);varcbw,zbw,wbw,rjw,ph,ExeRootPath:string;i,j,k:integer;t1,t2:Ttime;beginrjw:=trim(datetostr(dp_dtp.Date));cbw := trim(dp_cbbc.Text);zbw := trim(dp_cbbz.Text);wbw := trim(dp_cbbw.Text);t1:=0;t2:=0;if (cbw<>'') and (zbw<>'') and (wbw<>'') thenbegintryChDir(ExtractFilePath(Application.ExeName));ChDir('..');ExeRootPath := GetCurrentDir;dp_exapt.Connect;dp_exapt.Visible[0]:=false;dp_exapt.Workbooks.Add(ExeRootPath+'/config/sjcs.xls',0);dp_exwb.ConnectTo(dp_exapt.Workbooks[1]);dp_exws.ConnectTo(dp_exwb.Sheets[1] as _worksheet);j:=6;//起始行初始化with dp_form.dp_adoq1 dobeginclose;sql.Clear;sql.Add('select GWDY_SJPH,GWDY_ZTP from TB_GWDY order by GWDY_XH asc');open;while not eof dobeginph:=fieldbyname('GWDY_SJPH').AsString;i:=fieldbyname('GWDY_ZTP').AsInteger;if i=6 then{时间类型}begin{早班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' andYS_BB='''+cbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');open;for k:=6 to RecordCount+5 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);next;end;end;{中班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+zbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');open;for k:=11 to RecordCount+10 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);next;end;end;{晚班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+wbw+''' and YS_DATE='''+rjw+''' order by YS_XH asc');open;for k:=16 to RecordCount+15 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPTM').AsString);next;end;end;{月平均}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' and month(YS_DATE)='''+formatdatetime('mm',dp_dtp.Date)+''' order by YS_XH asc');open;while not eof dobegint1:=t1+strtotime(trim(fieldbyname('YS_YPTM').AsString));next;end;dp_exws.Cells.Item[j,22]:=timetostr(t1);t1:=0;end;{榨季平均}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPTM from TB_YS where YS_SJPH='''+ph+''' order by YS_XH asc');open;while not eof dobegint2:=t2+strtotime(trim(fieldbyname('YS_YPTM').AsString));next;end;dp_exws.Cells.Item[j,23]:=timetostr(t2);t2:=0;end;endelse{非时间类型}begin{早班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+cbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''2:30'',''4:30'',''6:30'',''8:30'','''') order by YS_XH asc');open;for k:=6 to RecordCount+5 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);next;end;end;{中班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+zbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''10:30'',''12:30'',''14:30'',''16:30'','''') order by YS_XH asc');open;for k:=11 to RecordCount+10 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);next;end;end;{晚班数据位置}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select YS_YPS from TB_YS where YS_SJPH='''+ph+''' and YS_BB='''+wbw+''' and YS_DATE='''+rjw+''' and YS_YPTM in(''18:30'',''20:30'',''22:30'',''00:30'','''') order by YS_XH asc');open;for k:=16 to RecordCount+15 dobegindp_exws.Cells.Item[j,k]:=trim(fieldbyname('YS_YPS').AsString);next;end;end;{月平均}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select avg(YS_YPS) as A from TB_YS where YS_SJPH='''+ph+''' and month(YS_DATE)='''+formatdatetime('mm',dp_dtp.Date)+''' group by YS_SJPH');open;if not eof thenbegindp_exws.Cells.Item[j,22]:=trim(fieldbyname('A').AsString);end;end;{榨季平均}with dp_form.dp_adoq2 dobeginclose;sql.Clear;sql.Add('select avg(YS_YPS) as B from TB_YS where YS_SJPH='''+ph+''' group by YS_SJPH');open;if not eof thenbegindp_exws.Cells.Item[j,23]:=trim(fieldbyname('B').AsString);end;end;end;j:=j+1;next;end;end;dp_exws.Cells.Item[2,1] := rjw;dp_exws.Cells.Item[4,6] := cbw;dp_exws.Cells.Item[4,11]:= zbw;dp_exws.Cells.Item[4,16]:= wbw;bb_tm.Enabled:=true;exceptshowmessage('模板路径出错或者是您还没有安装OFFICE办公软件');close;end;end;end;。
●南京帆软软件公司 ●商务咨询电话:86-025-5186 2240在Delphi 编程中利用Excel 实现动态报表0 引言随着计算机技术的不断普及, 办公的数字化程度越来越高, 出现了大量的计算机系统, 如固定资产管理系统、人事工资管理系统等等。
这其中存在大量的MIS 系统。
MIS 系统的一个重要特点是需要处理大量数据并形成报表。
由于行业或者其他一些原因, 这些报表的格式种类繁多, 而且还有一些复杂报表。
这些报表的格式在开发期间可能都无法设定。
为了解决这些问题, 本文采用了表格功能强大的Excel 作为报表模板, 用户可以按照自己的要求设置报表格式, 程序运行时再根据用户的设置动态填入数据, 从而实现动态报表功能。
1 实现原理先由用户按照自己的格式生成Excel 报表模板, 系统读取模板文件, 并把模板文件存入数据库, 保存用户输入的报表信息, 如某一字段填入第几行第几列。
报表打印时, 提取相应的Excel 文件, 利用Delphi 的Excel 控件填入数据库的数据, 实现动态报表功能。
2 实现过程2. 1 定义数据表系统使用MsSql Server2000数据库,定义两个表,一个是MB,用来存储报表基本信息和Excel 文件,一个是MB_Detail 存放报表的详细信息,如对应字段的行号和列号。
表结构如下:图1 MB 表结构 图2 MB _Detail 表结构MB 表中,“模板内容”字段为image 类型, 用来存储Excel 模板文件,“记录类型”字段用来表示是单张表格(只打印一条记录)还是列表(打印多条记录); MB Detail 表中的列号数据类型为char, 对应Excel 中的列号如A 、B 、C 等。
2. 2 保存和读取Excel 模板2. 2. 1 保存Excel 模板本系统将用户设置好的Excel 报表模板存入数据库“模板内容”字段。
由于本字段存储的是Excel 文件内容, 需要采用特殊的存储方式。
Delphi生成网页(html)报表Delphi 生成网页(html)报表在整理硬盘的时候,突然发现了这个小东西,回想起来是好多年前给永恩集团 (达芙妮) 做连锁POS系统的时候做的一个用DELPHI 生成HTML报表的测试(我已经5年没用DELPHI 了)。
为什么要求这么变态?我当初给达芙妮用 fastreport 做了一个报表,格式和数据展示完全满足要求,但最终被拒绝了,其原因是,他们原来有一套oracle erp 的打印就是用HTML 网页形式打印的。
我很崩溃,我记得oracle 里面的report builder 也很强的,为什么不用?其实到现在我仍然坚持用fastreport 做是对的,但当时,人家是客户,非得用html 的,你也没办法,人家就喜欢在浏览器里点右键打印,哎,这年头,什么样的需求都有。
当时这个团队没有去坐调研,我只好抽晚上空余时间,看了下资料,解决了这个问题,其实很简单,纯体力活。
delphi 里面有 webbrowser 控件,在这个上面直接输出html 代码就可以了。
你可以先用html做好一个模板,然后往里面填写数据即可。
这个报表很复杂的,涉及到分组,汇总聚合。
分类汇总,明细等在一个报表上。
也就是一个结构复杂的html 页面。
结构的复杂,说白了是体力活,其关键点:生成html模板举个很简单的例子,头部:{报表头部分一,6个参数}HTML_LZS_HEAD_ONE='<TABLE cellSpacing=0 border=0> '+'<TBODY> '+'<TR> '+'<TD align=right>分公司:</TD> '+'<TD align=left>%s</TD></TR> '+'<TR> '+'<TD align=right>经营小组:</TD> '+'<TD align=left>%s</TD></TR> '+'<TR> '+'<TD align=right>门店:</TD> '+'<TD align=left>%s</TD></TR>'+'<TR>'+'<TD align=right>年:</TD> '+'<TD align=left>%s</TD></TR> '+'<TR> '+'<TD align=right>月:</TD> '+'<TD align=left>%s</TD></TR> '+'<TR> '+'<TD align=right>单据状态:</TD> '+'<TD align=left>%s</TD></TR> '+'</TBODY> '+'</TABLE> ';从数据库中查询数据,得到结果,并填充F_HEAD_ONE:=Format(HTML_LZS_HEAD_ONE, [aqryPublic.FieldByName('SUBCOMPANY_ID').AsString, aqryPublic.FieldByName('WORKING_GROUP').AsString,aqryPublic.FieldByName('SHOP_ID').AsString,aqryPublic.FieldByName('REFERENCE_YEAR').AsString,aqryPublic.FieldByName('REFERENCE_MONTH').AsString,Fst ate]);这样我们就生成了一小段html 代码,如何显示在webbrowser 上呢?procedure TFrmReport.ShowHtml(content: widestring);varv: Variant;HTMLDocument: IHTMLDocument2;beginv := VarArrayCreate([0, 0], varVariant);v[0] := content;HTMLDocument := WebBrowser1.Document as IHTMLDocument2;HTMLDocument.write(PSafeArray(TVarData(v).VArray));HTMLDocument.close;HTMLDocument := nil;end;另外要注意initialization OleInitialize(nil); finalization OleUninitialize;。
批最近刚刚做完一个项目,使用到了RAVE进行报表设计,在使用中也查阅了很多资料,但总觉得网上的资料过于分散,而且都不是很全面,所以决定将如何在Delphi 7中使用RAVE报表写成几篇文章,由于本人从小语文学得不好,不是写作高手,这次也是第一次写这样的文章。
希望看到这篇文章的网友能多提意见,欢迎大家指教。
可以给我留言。
言归正传,在我们要给用户编写的软件中往往需要生成各种各样的报表,报表是数据库中数据的最终表现形式,在Delphi 6以前,编写报表都在使用Qusoft公司的Quick report,而且在Delphi中集成了Quick report。
在Borland Delphi™ 7 Studio 集成开发环境(IDE)的控件面板中取消了Quick report项,取而代之以Nevrona公司Rave Reports项,且在Tools中有Rave Designer 5.0 。
打开Rave Designer 5.0,我们可以如图所示的一个报表设计界面,开发人员可以开发出符合用户要求的报表来,而且这个报表的设计、使用与Delphi集成开发环境几乎是完全的一样,这可能是Rave与其它的报表组件最大的外观上的不同。
我在使用中下载了Rave Reports v5.1.3,你可以在这里或者这里下载,在写这篇文章时,上面上已经发布了Rave Reports 6.0,不过文章还是以Rave Reports v5.1.3为准。
打开Delphi,可以控件面板看到如图:Delphi7下的Rave打开Tools中的Rave,看到的报表设计界面如图:Rave5的报表设计界面一、Rave5的报表设计界面首先,介绍一下Rave的报表设计器的各组件和相关的属性。
Rave Designer集成开发环境的界面包括标题栏、菜单栏、快捷工具栏、组件栏和一些窗口:·标题栏显示了当前的工程名,位于最上部。
·菜单栏,一些功能可通过菜单栏的菜单命令实现。
·快捷工具栏为位图按钮,一些常用的菜单命令用这些按钮实现。
·报表组件栏分页显示各种组件(Standard、Report、Zoom、Colors、Lines、Fills、Fonts、Drawing、Bar Code、Alignment),在利用Rave开发应用程序的过程中,正确、合理地使用组件非常重要。
用它可设计基于数据库和文本的复杂报表。
·左边半部分像Delphi的object inspector工具,可设置报表元件的属性,它的下部分有对应属性的简短提示。
·正中部分为设计区域,开发者可在上面添加各种设计元件,如Drawing的横线、直线、矩形、椭圆,Barcode中各种常用的条码,Standand 中的Text、Memo、Section、Bitmap、Metafile等等。
·右边为设计导航区,可查看报表的各元件的更多信息,如报表库和数据显示目录,设计时也可快速定位元件位置。
[本帖最后由feyun 于2007-9-16 16:41 编辑]论坛模式推荐收藏分享给好友管理TAG:feyun发布于2007-09-16 16:42:07二、Rave的报表设计器,组件栏的各组件:1、Drawing (绘图)组件页:Line component :画线组件,所画的线较灵活。
可以看到其属性入图,有颜色、线宽、线行等属性,设计者根据需要更改属性。
改变线的长短位置,选中线条后,选择一个端点则光标会变为十子型,拖动即可。
Hline component :画水平线组件。
Vline component :画垂直线组件。
Rectangle component :画长方形组件,可以使用fill组件填充。
Square component :画正方形组件,可以使用fill组件填充。
Ellipse component :画椭圆组件,可以使用fill组件填充。
Circle component :画圆形组件,可以使用fill组件填充。
2、Bar Code(条形码)组件页:PostNetBarCode :打印邮件标签上包括POSTNET 条码。
I2of5BarCode :打印Interleaved 2 of 5条码。
Code39BarCode :打印standard and extended Code 39条码。
Code128BarCode :打印A, B and C Code 128条码。
UPCBarCode :打印UPC-12条码。
EANBarCode :打印EAN-13条码。
3、Standard(标准)组件页:Text :这个组件是在报表上固定的文字,例如报表的标题等,可以设置字体的大小、颜色,Rotation属性可以使要显示的字为任意角度。
Memo :Memo组件提供了多行文本的文字,与delphi中的相似,属性很多,但我们应用的不多,可以使用text属性添加文本。
Section :这个组件是其他组件的容器,将其他组件固定在此组件中。
Bitmap :这个组件是在报表中放置bmp文件(*.bmp),FileLink属性连接bmp文件。
MetaFile :这个组件在报表中放置meta文件(*.wmf),FileLink属性连接meta文件。
FontMaster :这个组件控制报表中的任何的text字的属性。
在要使用该字体的text组件或memo组件的fontmirrot属性选择FontMaster。
PageNumInit :报表显示页码的初始页码。
如图的InitValue的值为5,则报表的初始页为5,页码从5开始。
4、Report(报表)组件页:如果报表需要的是数据库的数据,则这个组件页中的组件使用比较频繁。
feyun发布于2007-09-16 16:42:18DataText:用来显示数据库中内容比较短的信息,要用它显示相应的数据库字段信息,则要使用到DataField 和DataView两个属性,用来连接数据库和字段。
DataText用来设计主从报表时,LookupDataView是相应的数据连接、LookupDisplay是显示内容、LookupField是主报表相应的数字段进行关联的字段的内容,也就是主数据字段进行连接的字段。
LookupInvalid是控制相应错误产生后的情况。
DataMemo:在Memo的基础上支持了数据库的字段显示, 使用DataField 和DataView两个属性,用来连接数据库和字段。
除了输出相应的文本内容外,还可以输出RTF格式,显示RTF格式,需要设置ContainsRTF属性为True。
CalcTex:这个组件用来统计报表字段的最大值、最小值、总和、统计值等内容直接使用,只需要通过CalcType属性来设置,CalcType属性包括了ctAverage(求平均值)、CtCount(求个数)、ctMax(求最大值)、ctMin(求最小值)、ctSum(求累加和)。
DataMirror Section:和Section组件相似。
Region:如果要进行报表的打印,Region组件规定了打印区域,可以设置Columns来分栏。
Band:这个组件算是一个容器组件,包括text、Memo组件等,包括的是非数据库库信息,Band组件要放置在Region中,选择BandStyle属性后,出现如下图的属性对话框。
左边为报表中Band的列表,右面的PrintLocation包括:Body Header(页眉)、Group Header(组眉)、Row Header (行眉)、Detail(表体)、Row Footer(行脚)、Group Footer(组脚)和Body Footer(页脚),BandStyle属性可以多选。
Print Occurrence属性包括:First(首页打印)、New Page(打印新一页)、New Column(新分栏)。
选择First(首页打印)也就是Band包括的内容只在第一页打印,选择New Page(打印新一页),Band包括的内容必须在新的一页打印,选择New Column(新分栏),Band包括的内容必须在新的分栏中打印。
DesignerHide属性:当一个报表有多个Band时,选择查找Band变得比较麻烦,设置DesignerHide属性为True时,没有选择到的Band内容被隐藏。
GroupDataView 和GroupKey属性:如果想要以相应的数据结果作为报表分组的依据,那么就必须设置这两个属性,GroupDataView是相应的数据源,GroupKey是数据源的索引,分组是靠GroupKey中的值进行分组的。
DataBand:是直接作用于数据库,且可以在其中摆放相应数据库报表组件,这样通过它就可以让相应的报表具有数据库书库打印功能。
其中DataView属性是设置相应的数据源,GroupDataView是相应的报表中的分组数据源。
DataCycle:与DataBand相似的地方在于循环的显示数据,DataBand是数据库内容的循环打印,而DataCycle不需要使用Region,它打印的区域为页面,每页只能打印一个组件设计好的内容。
使用DataBand是根据Region的范围来分页,而DataCycle则是每一页只现实一条信息根据数据的多少分页。
CalcOp:该组件提供了报表相应的计算功能,具体的使用会在以后讲解。
CalcTotal:与CalcOp结合使用来完成日常报表的统计功能。
5、Zoom(缩放)组件:在设计报表时,放大、缩小报表页面。
6、Colors(颜色)组件:对选择的对象快速的设置颜色。
7、Lines(线型)组件:对于选择的线,更改其线型。
8、Fills (填充)组件:对于正方形等图形填充样式。
9、Fonts(字体)组件:进行字体的设置。
10、Alignment(队列)组件:调整对齐组件和组建的层次。
feyun发布于2007-09-16 16:42:39隔了好长时间终于有时间继续向大家介绍RAVE了,这次主要介绍Delphi7下的Rave组件。
打开Delphi7,看到的rave页如下:Delphi7下的Rave包括有RvProject、RvSystem、RvNDRWriter、RvCustomConnection、RvDataSetConnection、RvTableConnection、RvQueryConnection、RvRenderPreview、RvRenderPrinter、RvRenderPDF、RvRenderHTML、RvRenderRTF、RvRenderText这几个组件。
一、RvProject组件在使用rave报表中,这个组件是最为重要的一个,是使用频率最高的一个组件,开发人员可以通过这个报表完成报表的打印、文件的生成、输出,土过此事可以使用设计状态,也可以通过它来点用相应的报表设计器。