报告数据源

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

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

  • public boolean next() throws JRException;

    • 在报表填写时,报表引擎在遍历数据时对数据源对象调用此方法。

  • public Object getFieldValue(JRField jrField) throws JRException;

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

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

数据源实现

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

数据源 实现类
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
Map-based 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 数据源

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

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

基于映射的数据源

如果父应用程序已将内存中的报告数据存储为 java.util.Map 对象,则实现类 JRMapArrayDataSourceJRMapCollectionDataSource 非常有用。包装数组或集合中的每个 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 文档中检索数据。此数据源实现的报告字段映射也基于字段列索引。

空数据源

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

可回退数据源

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

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

JRResultSetDataSource 之外,所有上述数据源实现都是可回退的,因为它不支持将记录指针移回。仅当手动使用此数据源包装 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;