📅  最后修改于: 2020-11-16 07:53:43             🧑  作者: Mango
数据源是结构化的数据容器。在生成报告时,JasperReports引擎从数据源获取数据。可以从数据库,XML文件,对象数组和对象集合中获取数据。我们在“填充报告”一章中看到,fillReportXXX()方法期望接收报告的数据源,该数据源必须以net.sf.jasperreports.engine.JRDataSource对象或java.sql.Connection (在关系数据库中找到报告数据时)。
JRDataSource接口只有两种方法,应实现-
公共布尔next()引发JRException;
在报表填充时,报表引擎在遍历数据时会在数据源对象上调用此方法。
public Object getFieldValue(JRField jrField)引发JRException;
此方法提供当前数据源记录中每个报告字段的值。
从数据源检索数据的唯一方法是使用报告字段。根据获取数据源中记录的方式,JRDataSource接口有几种默认实现。
下表给出了数据源及其实现类的摘要-
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 |
类JRResultSetDataSource提取一个java.sql.ResultSet对象。从关系数据库中提取报表数据时,这是最常用的数据源实现。如果改为将java.sql.Connection传递给引擎,则它将首先执行相关查询,并将返回的java.sql.ResultSet对象存储在JRResultSetDataSource实例中。
类JRBeanArrayDataSource和JRBeanCollectionDataSource表示可以包装JavaBean对象的数组和集合的实现。在这种类型的数据源中,数组或集合中的每个对象将被视为一条记录。特定的JavaBean属性和相应的报告字段之间的映射是通过命名约定进行的。报告字段的名称必须与JavaBeans规范指定的JavaBean属性的名称相同。
在本教程的所有示例中,我们都使用了JRBeanCollectionDataSource。
如果父应用程序已经将报告数据以java.util.Map对象的形式存储在内存中,则实现类JRMapArrayDataSource和JRMapCollectionDataSource很有用。包装的数组或集合中的每个Map对象都被视为数据源中的虚拟记录,并且使用名为key的报告字段从地图中提取每个报告字段的值。
在许多客户端应用程序中,数据以表格格式显示。在许多应用程序中,一个共同的要求是允许用户将该表格格式打印为报告。实现类JRTableModelDataSource使对于Swing应用程序而言,从表格格式生成报告的任务变得微不足道。此类包装一个javax.swing.table.TableModel对象。包装好的TableModel对象中的列可以通过其名称或从0开始的索引来访问。
类JRXmlDataSource是基于DOM的数据源实现,它使用XPath表达式从XML文档中选择数据。 XML数据源中的记录由通过XPath表达式选择的节点元素表示。使用字段描述(JRXML中的
XPath是一种用于浏览XML文档的属性和元素的语言。有关XPath的更多信息,请访问http://www.w3.org/TR/xpath。
JRCsvDataSource表示数据源的实现,该数据源从结构化文本文件中检索其数据。通常是CSV。使用字段的列索引检索字段值。
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;