JasperReports 数据源
1 什么是JasperReports 数据源
数据源是结构化数据容器。在生成报表时,JasperReports 引擎从数据源获取数据。可以从数据库、XML 文件、对象数组和对象集合中获取数据。我们在《JasperReports 填充报表》一章中看到,fillReportXXX()方法期望接收报表的数据源,该数据源必须以net.sf.jasperreports.engine.JRDataSource对象或java.sql.Connection (当在关系数据库中找到报表数据时)。
JRDataSource 接口只有两个方法,应该实现 -
-
public boolean next() throws JRException;
-
在报表填充时,报表引擎在遍历数据时在数据源对象上调用此方法。
-
-
public Object getFieldValue(JRField jrField) throws JRException;
-
此方法为当前数据源记录中的每个报表字段提供值。
-
从数据源检索数据的唯一方法是使用报表字段。JRDataSource 接口有几种默认实现,根据获取方式不同,获取数据源中的记录。
2 JasperReports 数据源实现
下表总结了数据源及其实现类:
数据源名称 | 数据源实现类 |
---|---|
JDBC | net.sf.jasperreports.engine.JRResultSetDataSource |
JavaBean | net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource |
基于Map | net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource |
TableModel | net.sf.jasperreports.engine.data.JRTableModelDataSource |
XML | net.sf.jasperreports.engine.data.JRXmlDataSource |
CSV | net.sf.jasperreports.engine.data.JRCsvDataSource |
XLS | net.sf.jasperreports.engine.data.JRXlsDataSource |
Empty | net.sf.jasperreports.engine.JREmptyDataSource |
JDBC 数据源
JRResultSetDataSource 是 一个java.sql.ResultSet对象。这是从关系数据库中提取报表数据时最常用的数据源实现。如果将java.sql.Connection传递给引擎,它首先执行相关查询并将返回的java.sql.ResultSet对象存储在 JRResultSetDataSource 实例中。
JavaBean 数据源
JRBeanArrayDataSource和JRBeanCollectionDataSource表示可以包装 JavaBean 对象的数组和集合的实现。数组或集合中的每个对象都将被视为此类数据源中的一个记录。特定 JavaBean 属性和相应报表字段之间的映射是通过命名约定进行的。报表字段的名称必须与 JavaBeans 规范指定的 JavaBean 属性的名称相同。
在本教程的所有示例中,我们都使用了 JRBeanCollectionDataSource。
基于Map的数据源
如果父应用程序已经将内存中可用的报告数据存储为java.util.Map 对象,则实现类JRMapArrayDataSource和JRMapCollectionDataSource非常有用。包装的数组或集合中的每个 Map 对象都被认为是数据源中的一个虚拟记录,并且使用命名为键的报告字段从映射中提取每个报表字段的值。
TableModel 数据源
在许多客户端应用程序中,数据以表格格式显示。许多应用程序中的一个常见要求是允许用户将此表格格式打印为报表。实现类JRTableModelDataSource使得从表格格式生成报表的任务对于 Swing 应用程序来说是微不足道的。这个类包装了一个 javax.swing.table.TableModel 对象。包装的 TableModel 对象中的列可以通过它们的名称或它们的基于 0 的索引来访问。
XML 数据源
JRXmlDataSource类是基于 DOM 的数据源实现,它使用 XPath 表达式从 XML 文档中选择数据。XML 数据源中的记录由通过 XPath 表达式选择的节点元素表示。使用字段描述(JRXML 中的<fieldDescription> 元素)提供的XPath 表达式从每条记录中检索字段值。
XPath 是一种用于浏览 XML 文档的属性和元素的语言。有关 XPath 的更多信息,请访问 http://www.w3.org/TR/xpath。
CSV 数据源
JRCsvDataSource表示数据源的实现,它从结构化文本文件中检索数据;通常是 CSV。使用它们的列索引检索字段值。
XLS 数据源
JRXlsDataSource表示数据源的实现,它从 Excel 文档中检索数据。此数据源实现的报表字段映射也基于字段列索引。
Empty空数据源
类JREmptyDataSource模拟内部具有给定数量的虚拟空记录的数据源。UI 工具使用它来提供基本的报告预览功能,或用于特殊的报告模板,或用于测试和调试目的。
3 JasperReports JRRewindableDataSource类
net.sf.jasperreports.engine.JRRewindableDataSource继承了基本的JRDataSource接口。它只向接口添加了一个名为 moveFirst() 的方法。此方法旨在将光标移动到数据源中的第一个元素。
当处理放置在由于 isSplitAllowed="false" 设置而不允许拆分的带子内的子报表时,可重绕数据源非常有用,并且当前页面上没有足够的空间来呈现子报表。
除了JRResultSetDataSource之外,所有上述数据源实现都是可回绕的,因为它不支持将记录指针移回。仅当在将 java.sql.ResultSet 传递给子报表之前手动使用此数据源包装 java.sql.ResultSet 时,才会出现问题。没有问题,如果SQL查询驻留在子报表模板中,因为引擎会在下一页重新启动子报表时再次执行它。
4 JasperReports JRDataSourceProvider接口
JasperReports 库有一个接口net.sf.jasperreports.engine.JRDataSourceProvider。这有助于创建和处置数据源对象。使用 GUI 工具创建报告模板时,需要一个用于自定义报告数据源的特殊工具。JRDataSourceProvider 是将自定义数据源插入设计工具的标准方法。此接口的自定义实现应实现以下方法,这些方法允许创建和处理数据源对象以及列出数据源内可用报表字段的方法(如果可能)
public boolean supportsGetFieldsOperation();
public JRField[] getFields(JasperReport report) throws JRException, UnsupportedOperationException;
public JRDataSource create(JasperReport report) throws JRException;
public void dispose(JRDataSource dataSource) throws JRException;