Delphi 7 中使用RAVE报表(一)

Delphi 7 中使用RAVE报表(一),第1张

最近刚刚做完一个项目 使用到了RAVE进行报表设计 在使用中也查阅了很多资料 但总觉得网上的资料过于分散 而且都不是很全面 所以决定将如何在Delphi 中使用RAVE报表写成几篇文章 由于本人从小语文学得不好 不是写作高手 这次也是第一次写这样的文章 希望看到这篇文章的网友能多提意见 欢迎大家指教 可以给我留言

言归正传 在我们要给用户编写的软件中往往需要生成各种各样的报表 报表是数据库中数据的最终表现形式 在Delphi 以前 编写报表都在使用Qusoft公司的Quick report 而且在Delphi中集成了Quick report 在Borland Delphi&# Studio 集成开发环境(IDE)的控件面板中取消了Quick report项 取而代之以Nevrona公司Rave Reports项 且在Tools中有Rave Designer

打开Rave Designer 我们可以如图所示的一个报表设计界面 开发人员可以开发出符合用户要求的报表来 而且这个报表的设计 使用与Delphi集成开发环境几乎是完全的一样 这可能是Rave与其它的报表组件最大的外观上的不同

我在使用中下载了Rave Reports v 你可以在// nevrona / 或者// delphibox / 下载 在写这篇文章时 // nevrona /上已经发布了Rave Reports 不过文章还是以Rave Reports v 为准 打开Delphi 可以控件面板看到如图

Delphi 下的Rave

打开Tools中的Rave 看到的报表设计界面如图

Rave 的报表设计界面

一 Rave 的报表设计界面

首先 介绍一下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等等 ·右边为设计导航区 可查看报表的各元件的更多信息 如报表库和数据显示目录 设计时也可快速定位元件位置

二 Rave的报表设计器 组件栏的各组件

1 Drawing (绘图) 组件页

Line ponent 画线组件 所画的线较灵活 可以看到其属性入图 有颜色 线宽 线行等属性 设计者根据需要更改属性 改变线的长短位置 选中线条后 选择一个端点则光标会变为十子型 拖动即可

Hline ponent 画水平线组件

Vline ponent 画垂直线组件

Rectangle ponent 画长方形组件 可以使用fill组件填充

Square ponent 画正方形组件 可以使用fill组件填充

Ellipse ponent 画椭圆组件 可以使用fill组件填充

Circle ponent 画圆形组件 可以使用fill组件填充

2 Bar Code(条形码)组件页

PostNetBarCode 打印邮件标签上包括 POSTNET 条码

I of BarCode 打印 Interleaved of 条码

Code BarCode 打印standard and extended Code 条码

Code BarCode 打印 A B and C Code 条码

UPCBarCode 打印 UPC 条码

EANBarCode 打印 EAN 条码

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开始

4 Report(报表)组件页

如果报表需要的是数据库的数据 则这个组件页中的组件使用比较频繁

DataText 用来显示数据库中内容比较短的信息 要用它显示相应的数据库字段信息 则要使用到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(字体)组件 进行字体的设置

lishixinzhi/Article/program/Delphi/201311/24824

这个很简单的.不知道你想用什么样的报表设计控件.

Delphi自带的有Rave,还可以装QuickReport.本人最常使用的是FastReport.

可以给你介绍下FastReport的用法:

在form中放置一个frxRport,frxDBDataSet.设置frxDBDataSet--Dataset为你的查询的DataSet.

打开报表,导入该Data(主菜单部分).

报表的表头表未随便你加.

放置一个MasterDetail绑定到DATASET,放置MEMO指定到对应字段

 Excel是大家都比较熟悉的表格处理软件 用它来做自由报表载体其好处有

1 从用户角度

载体本身具有脚本支持 公式编辑 模板支持 格式 版式设计等诸多功能 而这些功能对于大部分用户是比较熟悉的 省去了用户培训环节 多数办公用电脑都装有Office软件 所以 其输出的报表可以被任何装有Office软件的计算机浏览

2 从开发者角度

可以通过OLE访问 提供了大量的编程接口 几乎所有的 *** 作都可以用程序来控制 利用宏 VBA等技术可以很轻松地编写报表设计模块

整体思路

程序通过OLE获取Excel的Sheet对象 遍历每个单元格 将模板中的元素以变量 表格等替换 就生成了最终报表 其中元素种类可分为变量元素 数据集元素 数据字段元素和其它标志元素 它们都是处于单元格内的包含特殊格式的字符串 格式可以自由定义 但要保证此格式不会与正文相冲突

#ValueAA# (变量名两边加入#号 当遍历到其所在的单元格时在程序中对单元格进行相应处理)

报表功能实现

首先新建Excel模板 如下图 模板保存为template xlt

现在模板有了 现在需要实现的功能就是分析此模板 将模板中的元素替换为程序中将要输出的变量或数据表

下面我们来设计一个简单的模板分析类(TXlTemplateAnalyzer)

1 公有方法

generateReport //套用模板生成最终报表

registerDataSet //在DataSet列表中新增数据集

registerParam //在Param列表中新增变量

removeDataSet //在DataSet列表中删除数据集

removeParam //在Param列表中删除变量 SetSheetObject //设置模板的Sheet对象

2 私有成员变量

FBoundLeft FBoundRight //保存左右列边界

FDataSetList //用于维护数据集列表的私有成员

FParamList //用于维护变量列表的的私有成员

FExcelSheetObject // *** 作模板的Sheet对象 FCurrentRow //当前处理的行号

FCurrentCol //当前处理的列号

3 私有工具方法

ProcessDataSetElement //处理数据集元素

getTemplateBoundary //获取边界索引号

parsorFieldNameFromElement //从模板元素中提取字段名

FindParam //从FParamList中查找特定Name的变量

FindDataSet //从DataSetList中查找特定Name的DataSet

IsTamplateElement //判断是否为元素

IsDataSetFieldElement //是否为数据字段元素

IsDataSetBeginElement //是否为DataSet起始元素

IsControlTag //是否为控制元素

IsParamElement //是否为变量元素

4 事件

OnParamElement

OnDataSetOperationElement

OnControlElement

OnDataSetFieldElement

OnElement

写到这里大家可能已经知道我的用意了 其实这么多类成员中 但其核心就在于generateReport和ProcessDataSetElement这两个方法

(以下代码只是描述性的脚本代码 在Delphi中不能编译)

generateReport:

循环遍历单元格

FCurrentRow := iRow

FCurrentCol := iCol//保存当前正在处理的行列索引号

CellObj := FExcelSheetObject Cells[iRow iCol]//取当前单元格对象

CellValue := CellValue Value//取单元格内容

if IsTamplateElement(CellValue) //判断是否为模板元素

begin

if IsDataSetBeginElement(CellValue) then //判断是否为数据集开始元素

begin

ProcessDataSetElement (CellValue)//处理数据集元素

end

if IsParamElement then(CellValue) then //判断是否为变量元素

CellObj Value := FindParam(CellValue)//查找变量值 填到当前单元格中

if IsControlTag(CellValue) then

…………………

end

遍历循环结束

执行到这里 报表生成完毕

ProcessDataSetElement

ADataSet := FindDataSet(CellValue)

for j:= to ADataSet RecordCount do

begin

FExcelSheetObject Rows[FCurrentRow + j] Delete//将当前行删除(也就是#Table Begin()#所在的行)

FExcelSheetObject Rows[FCurrentRow + j] Insert//新增行

FExcelSheetObject Rows[FCurrentRow + j] Copy(FExcelSheetObject Rows[FCurrentRow + ])

for i:= FBoundLeft to FBoundLeft do

begin

fieldCellStr := FExcelSheetObject Rows[FCurrentRow + j] Cell[i] Value//获取数据字段元素

fieldname := parsorFieldNameFromElement(fieldCellStr)//从元素中解析字段名

FExcelSheetObject Rows[FCurrentRow + j] Cell[i] := ADataSet FieldByName(fieldname) Value//将//相应字段的值赋入单元格

end

ADataSet Next

end

FCurrentRow := FCurrentRow + j

到这里 这个模板分析类的核心功能基本完成了 我想如果这个类的实现代码全部完成后 应该把这个类做成一个Component 并注册到Delphi的IDE中 以便以后使用 在上面提到的类的事件 是用来实时通知客户当前正在处理哪个Element和Cell 客户可以在此事件中做更进一步的特殊处理(例如将上述模板中产值小于完成计划数的单元格置为红色等等) 非常灵活 但是出于代码整洁 在这里我没有加到代码中 另外在程序中还可以在报表中加入Excel的各种Chart Shape等对象 这些留着我以后再写吧

TXlTemplateAnalyzer类的是这样调用

begin

1 先将数据集 变量注册

templtAnalyzer RegisterDataSet(DataSet Table)

templtAnalyzer RegisterParam(Now Date )

templtAnalyzer RegisterParam(totalQu TotalQuantity )

templtAnalyzer RegisterParam(totalPlan TotalPlan )

templtAnalyzer RegisterParam(totalPer TotalPercent )

2 生成报表

templtAnalyzer generateReport

end

参考文档 MSDN:Microsoft Developer Net

好了 大家不妨按我的思路试试 希望我的这篇文章能给大家带来帮助

lishixinzhi/Article/program/Delphi/201311/8465


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9687181.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存