Delphi报表和图表设计
- 格式:ppt
- 大小:398.50 KB
- 文档页数:4
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 数据库开发及统计表格设计Delphi 是Borland 公司开发的基于PASCAL 语言的Windows 平台应用程序开发工具,它将可视化编程(Visual Programming) 与面向对象(Object-Oriented) 的卓越优点结合在PASCAL 语言开发平台上,而且同时可以支持Client/Server 模式的SQL 数据库访问与ODBC (开发数据库互连) ,是一个真正面向对象的开发工具。
Delphi 最吸引人的特点是它的强大的数据库访问能力,它主要通过使用数据库引擎(Borland Database Engine,简称BDE)来访问本地数据库和远程数据库。
但对于用户而言,不必直接编程访问BDE ,而只需通过采用窗体(FORM) 和大量方便且实用的数据库访问元件(Component)来实现,通过ReportSmith报表生成器可以生成多种随心所欲的报表。
但是,用ReportSmith 制作的各类报表,只便于输出至打印机上打印出来,若想把报表在屏幕上显示,则还需调用ReportView 。
而ReportView 窗口界面对不太懂Delphi 和Windows 操作的普通用户来说,不直观,也不易操作。
如何制作并在屏幕上显示出直观的二维统计报表,这是本文所要阐述的主要问题。
以表格形式显示数据库内容一般地采用下面两种方式:•纵向列表(如图1)•交叉统计列表(如图2)一、纵向列表Delphi 可以用TDBGRID 控件,以表格形式非常方便地显示单一或多数据库纵向列表。
一般采用两种方法实现:(一)采用TTable 与Tdatasource、TDbgrid 控件在窗体中引入上述三个控件,并在Ttable 中控件指出要访问的数据库存放路径及数据库名,在Tdatasource 控件中指出数据源与Ttable 相连,在TDbgrid 控件中指出显示Tdatasource数据源内容,程序运行后,则显示出如图1所示的数据库纵向列表。
批最近刚刚做完一个项目,使用到了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集成开发环境的界面包括标题栏、菜单栏、快捷工具栏、组件栏和一些窗口:·标题栏显示了当前的工程名,位于最上部。
·菜单栏,一些功能可通过菜单栏的菜单命令实现。
Delphi利⽤ReportMachine报表控件制作⼩计和总计报表最近在做⼀个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 excel 例程Delphi Excel 例程:一步一步回答在Delphi中,我们可以使用Excel 例程来实现与Excel文件的交互。
Excel 例程是一组可以通过Delphi编程语言来操作Excel文件的方法和函数。
本文将介绍如何使用Delphi和Excel 例程来创建、读取、写入和操作Excel 文件。
第一步:安装Excel 例程要开始使用Delphi和Excel 例程,我们首先需要安装Excel 例程库。
这可以通过三种方法之一来实现:1. 使用ActiveX组件:在Delphi IDE的“Component”菜单下,选择“Import ActiveX Control”。
在弹出的窗口中,选择“Microsoft Excel xx.x Object Library”(其中"xx.x"表示Excel版本号),然后点击“Install”按钮进行安装。
2. 使用第三方库:你还可以使用第三方库,如TExcelComponent或Flexcel,它们提供了更多的功能和灵活性。
3. 编写自己的Excel 例程:如果你对编程充满信心,你可以自己编写一组Excel 例程,以与Excel文件交互。
不过,这需要一些时间和努力。
第二步:创建一个新的Excel文件在使用Delphi和Excel 例程之前,我们首先需要创建一个Excel文件。
下面是示例代码,展示了如何使用Excel 例程来创建和保存一个新的Excel文件:delphivarExcelApp: Variant;ExcelWorkbook: Variant;ExcelWorksheet: Variant;begin创建Excel应用程序对象ExcelApp := CreateOleObject('Excel.Application');创建一个新的工作簿ExcelWorkbook := ExcelApp.Workbooks.Add;获取第一个工作表ExcelWorksheet := ExcelWorkbook.Worksheets.Item[1];设置单元格的值ExcelWorksheet.Cells[1, 1].Value := 'Hello'; ExcelWorksheet.Cells[1, 2].Value := 'World!';保存工作簿ExcelWorkbook.SaveAs('C:\NewExcelFile.xlsx');关闭Excel应用程序ExcelApp.Quit;end;通过这段代码,我们可以创建一个新的Excel应用程序对象,并在其中创建一个新的工作簿。
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 文件内容, 需要采用特殊的存储方式。