Jasper Reports 简明教程

Report Data Sources

数据源是结构化的数据容器。在生成报表时,JasperReports 引擎从数据源获取数据。可以从数据库、XML 文件、对象数组以及对象集合获取数据。我们已经在 Filling Reports 章中看到,fillReportXXX() 方法期望接收报表的数据源,它必须以 net.sf.jasperreports.engine.JRDataSource 对象或 java.sql.Connection 的形式进行填充(如果报表数据位于关系数据库中)。

JRDataSource 接口只有两个方法,应该实现以下内容 −

  1. public boolean next() throws JRException;在报表填充时,报告引擎在遍历数据时对数据源对象调用此方法。

  2. public Object getFieldValue(JRField jrField) throws JRException;此方法为当前数据源记录中的每个报表字段提供值。

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

Datasource Implementations

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

Datasource

Implementation Class

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 Data Sources

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

JavaBean Data Sources

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

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

Map-based Data Sources

如果父应用程序已将报告数据存储在内存中,类 JRMapArrayDataSourceJRMapCollectionDataSource 的实现非常有用。包装的数组或集合中的每个 Map 对象都被视为数据源中的一个虚拟记录,报表字段的值是从使用报告字段(指定为键)的 map 中提取的。

TableModel Data Sources

在许多客户端应用程序中,数据以表格格式显示。许多应用程序中一个常见的需求是允许用户将此表格格式打印为报表。实现类 JRTableModelDataSource 使得从表格格式为 Swing 应用程序生成报表变得轻而易举。此类包装一个 javax.swing.table.TableModel 对象。可以通过它们的名称或它们的以 0 为基准的索引来访问包装的 TableModel 对象中的列。

XML Data Sources

JRXmlDataSource 是一种基于 DOM 的数据源实现,它使用 XPath 表达式从 XML 文档中选择数据。XML 数据源中的记录由通过 XPath 表达式选择的节点元素表示。使用字段说明(JRXML 中的 <fieldDescription> 元素)提供的 XPath 表达式从每个记录中检索字段值。

XPath 是一种用于导航 XML 文档的属性和元素的语言。在 http://www.w3.org/TR/xpath. 中可以找到有关 XPath 的更多信息

CSV Data Sources

JRCsvDataSource 表示一种用于数据源的实现,它从结构化文本文件(通常是 CSV)中检索其数据。使用它们的列索引检索字段值。

XLS Data Sources

JRXlsDataSource 表示一种用于数据源的实现,它从 Excel 文档中检索其数据。此数据源实现的报表字段映射也基于字段列索引。

Empty Data Sources

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

Rewindable Data Sources

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

当使用不允许拆分(因为 isSplitAllowed="false" 设置而产生)的频带中放置的子报表进行操作时,可回绕数据源非常有用,且当前页面上没有足够空间来渲染子报表。

以上所有数据源实现都是可回绕的,除了 JRResultSetDataSource ,因为它不支持将记录指针移回。仅当此数据源被手动用于包装一个 java.sql.ResultSet 并将其传递到子报表中时,才会出现问题。如果 SQL 查询位于子报表模板中,则不存在问题,因为引擎会在下个页面重新启动子报表时再次执行它。

Data Source Providers

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;