报告数据来源


数据源是结构化数据容器。在生成报告时,JasperReports 引擎从数据源获取数据。数据可以从数据库、XML 文件、对象数组和对象集合中获取。我们在填充报告一章中看到, fillReportXXX() 方法期望接收必须填充的报告的数据源,其形式为net.sf.jasperreports.engine.JRDataSource对象或java.sql.Connection (当在关系数据库中找到报告数据时)。

JRDataSource 接口只有两个方法,应该实现 -

  • public boolean next() 抛出 JRException;

    • 在报告填充时,报告引擎在迭代数据时在数据源对象上调用此方法。

  • public Object getFieldValue(JRField jrField) 抛出 JRException;

    • 此方法提供当前数据源记录中每个报表字段的值。

从数据源检索数据的唯一方法是使用报表字段。JRDataSource 接口有多种默认实现,具体取决于获取数据源中记录的方式。

数据源实现

下表总结了数据源及其实现类 -

数据源 实现类
数据库连接 net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource、net.sf.jasperreports.engine.data.JRBeanArrayDataSource
基于地图 net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource
表模型 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
空的 net.sf.jasperreports.engine.JREmptyDataSource

JDBC 数据源

JRResultSetDataSource类丢弃java.sql.ResultSet对象。这是从关系数据库提取报表数据时最常用的数据源实现。如果将java.sql.Connection传递给引擎,它首先执行相关查询并将返回的java.sql.ResultSet对象存储在 JRResultSetDataSource 实例中。

JavaBean 数据源

JRBeanArrayDataSourceJRBeanCollectionDataSource表示可以包装 JavaBean 对象的数组和集合的实现。数组或集合中的每个对象将被视为此类数据源中的一条记录。特定 JavaBean 属性和相应的报告字段之间的映射是通过命名约定进行的。报告字段的名称必须与 JavaBeans 规范指定的 JavaBean 属性的名称相同。

在本教程的所有示例中,我们都使用了 JRBeanCollectionDataSource。

基于地图的数据源

如果父应用程序已将内存中可用的报告数据存储为java.util.Map 对象,则实现类JRMapArrayDataSourceJRMapCollectionDataSource非常有用。包装数组或集合中的每个 Map 对象都被视为数据源中的虚拟记录,并且使用名为键的报告字段从映射中提取每个报告字段的值。

表模型数据源

在许多客户端应用程序中,数据以表格格式显示。许多应用程序中的一个常见要求是允许用户将此表格格式打印为报告。实现类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 文档检索数据。此数据源实现的报表字段映射也基于字段列索引。

空数据源

JREmptyDataSource模拟内部具有给定数量的虚拟空记录的数据源。UI 工具使用它来提供基本的报告预览功能,或用于特殊报告模板,或用于测试和调试目的。

可回滚的数据源

net.sf.jasperreports.engine.JRRewindableDataSource扩展了基本的JRDataSource接口。它仅向接口添加一个名为 moveFirst () 的方法。此方法旨在将光标移动到数据源中的第一个元素。

当处理放置在由于 isSplitAllowed="false" 设置而不允许分割的带内的子报表并且当前页面上没有足够的空间来呈现子报表时,可回滚数据源非常有用。

除了JRResultSetDataSource之外,上述所有数据源实现都是可回滚的,因为它不支持向后移动记录指针。仅当在将 java.sql.ResultSet 传递给子报表之前手动使用此数据源来包装 java.sql.ResultSet 时,才会出现问题。如果 SQL 查询驻留在子报表模板中,则没有问题,因为在下一页重新启动子报表时引擎将再次执行它。

数据源提供商

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;