- JasperReports 教程
- JasperReports - 首页
- JasperReports - 入门
- JasperReports - 环境设置
- JasperReports - 生命周期
- JasperReports - 设计
- JasperReports - 编译设计
- JasperReports - 填充
- JasperReports - 查看和打印
- JasperReports - 导出
- JasperReports - 参数
- JasperReports - 数据源
- JasperReports - 字段
- JasperReports - 表达式
- JasperReports - 变量
- JasperReports - 节
- JasperReports - 分组
- JasperReports - 字体
- JasperReports - Unicode 支持
- JasperReports - 样式
- JasperReports - 脚本
- JasperReports - 创建子报表
- JasperReports - 创建图表
- JasperReports - 交叉表
- JasperReports - 国际化
- JasperReports 资源
- JasperReports - 快速指南
- JasperReports - 有用资源
- JasperReports - 讨论
报表数据源
数据源是结构化的数据容器。在生成报表时,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 的 | 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 |
| 空 | 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 对象都被视为数据源中的虚拟记录,每个报表字段的值都是使用报表字段作为键从 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;