报告数据源

数据源是结构化数据容器。在生成报告时,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 数据源

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

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

基于映射的数据源

如果父应用程序已将内存中的报告数据存储为 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 文档中检索数据。此数据源实现的报告字段映射也基于字段列索引。

空数据源

类 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;