iReport子报表(SubReport)
CubeBI 立方开源商业智能
SubReport是ireport提供的高级功能,通过SubReport我们可以创建复杂的报表。通过SubReport我们可以创建一个包含若干个子报表的报表。创建一个包含子报表的报表我们需要三个对象:一个jasper文件,一个包含参数map(当然可以为空)和一个DataSource(数据源,或者是一个JDBC的Connection)。在本章中我们将解释如何通过这三个对象创建一个SubReport并实现在子报表中数据过滤显示的目的。
9.1 创建一个子报表(create a SubReport)
一个SubReport是一个真正的包含它自己xml文件并且是一个已经编译好的jasper文件。创建一个SubReport就是创建一个普通的报表文件,创建过程中唯一需要注意的是设置SubReport的宽度、高度及一些不需要显示的band,一般情况下对于不显示的band我们把它们的高度都设置为0。在设置子报表的宽度时我们应该考虑到它在父报表中显示时的效果,然后针对这一特性有针对性的去设置。
在父报表中我们要添加一个子报表可以通过iReport中的SubReport工具 来实现。子报表的形状和一个距形类似,我们可以调整SubReport的尺寸和位置以控制子报表的显示。
将一个子报表链接到父报表中需要做三件事情:获得SubReport所对应的jasper报表对象、如何为它提供数据及如何为子报表的parameters设置具体的值。所有这些信息的定义我们可以通过SubReport properties窗口来实现。
图9.1
图9.2
9.2 传递参数(Passage of the parameters)
当我们在应用程序里通过fillReport方法来生成一个报表的时候,我们会提供一个包含参数值的Map一起传递到报表中,包含参数的Map对象是由报表引擎直接管理的。在子报表属性窗口的里的“SubReport”标签里的“Parameters Map Expression”属性就是提供给我们的
最简单的方法来为子报表设置parameters的值,它允许我们定义一个最终可以返回java.util.Map对象的表达式,使用这种方法我们可以把从外部应用程序传到父报表里的parameter对象,当然这个parameter的实际值是一个java.util.Map对象传递给子报表使用(比如$P{TestMap}),这里我们也可以使用内建的报表parameters:$P{REPORT_PARAMETES_MAP}把子报表中的java.util.Map对象传递到父报表中供使用。如果该属性我们空着不填那么一个不包含任何值的空的java.util.Map将会被传到子报表中。这种机制的局限性是parameters里所对应的java.util.Map值是死的、不会变的。为了克服这种局限性jasperreport允许我们定义parameter键值对的时候每个对象的值通过一个表达式来创建,如在图9.2中的“SubReport Parameter”表中通过添加个参数java.util.Map来填充子报表。
图9.3
deptId是子报表中一个parameter的名称,如果设置值时也要与子报表中deptId的数据类型保持一致。
指定数据源
为子报表指定数据源就是告诉jasperreport引擎如何获到数据来填充SubReport。我们可以指定两种类型的数据源:JDBC Connection和DataSource。
使用JDBC来填充报表是很简单的,在Connection Expression里定义一个已经连接到数据库的java.sql.Connection对象。要把一个已经处于打开状态下的连接传到SubReport中我们只需使用一个预定义的包含一个基于从应用程序里调用fillReport方法时的传入的连接REPORT_CONNECTION参数
如果使用一个DataSource就稍微复杂一点,事实上它是一个简单的记录的集合,记录集合的概念和JDBC Connection不同,既然如此我们可以通过一个parameter来传递一个DataSource来填充SubReport,此时采用这种机制内建的parameter REPORT_CONNECT
ION就不再起作用了。
一个DataSource是一个普通的“消费品”对象仅仅可用来填充一次报表。所以一个作parameter传递的DataSource可以满足一个SubReport的需要。因此parameter的方式不能满足当父报表的每一行记录都有一些子报表的数据与之对应(除非主报表中只有一条记录)。当我们解释DataSource时我们可以看到这个问题可以通过自定义DataSource方式解决。
指定SubReport
创建一个SubReport我们需要指定一个扩展名为.jasper文件,我们需要在SubReportdatasource是什么意思属性窗口中设置SubReport Expression属性。表达式返回的类型必须与我们在下拉框里选择的类似保持一致,类型列表如下:
类型名称 | 含义 |
net.ine.JasperReport | 在一个JasperReport对象里预加载一个jasper文件 |
Java.io.InputStream | 一个jasper文件的流 |
Java URL | 一个用来定义jasper文件的URL |
Java.io.File | 一个jasper文件的File对象 |
Java.lang.String | Jasper文件的文件名 |
如果表达式是一个String类型,那么引擎将通过JRLoad来加载指定位置的jasper文件。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论