JasperReports map data sources
last modified February 12, 2024
In this article we show how to use JRMapArrayDataSource and JRMapCollectionDataSource as data sources in JasperReports library.
JasperReports is an open-source reporting library. It can create reports in various formats including PDF, HTML, XLS, or CSV. JasperReports creates page-oriented, ready-to-print documents.
JasperReports has two data sources that work with maps of data.
JRMapArrayDataSource is a datasource that contains data as an
array of maps. JRMapCollectionDataSource is a datasource that
contains data as a list of maps.
JasperReports map datasource example
In the following example, we generate a report from a collection/array of map objects.
<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
"http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">
<jasperReport xmlns = "http://jasperreports.sourceforge.net/jasperreports"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://jasperreports.sourceforge.net/jasperreports
http://jasperreports.sourceforge.net/xsd/jasperreport.xsd"
name="report" topMargin="20" bottomMargin="20">
<field name="id" class="java.lang.Integer">
<fieldDescription><![CDATA[id]]></fieldDescription>
</field>
<field name="name">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<field name="occupation">
<fieldDescription><![CDATA[occupation]]></fieldDescription>
</field>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="50" height="20"/>
<textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="70" y="0" width="80" height="20"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="170" y="0" width="80" height="20"/>
<textFieldExpression><![CDATA[$F{occupation}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
The report template uses three fields: id, name, and
occupation.
package com.zetcode
@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0')
@Grab(group='com.github.librepdf', module='openpdf', version='1.3.39')
import net.sf.jasperreports.engine.JasperCompileManager
import net.sf.jasperreports.engine.JasperExportManager
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.data.JRMapCollectionDataSource
def users = [
['id': 1, 'name': 'John Doe', 'occupation': 'gardener'],
['id': 2, 'name': 'Roger Roe', 'occupation': 'driver'],
['id': 3, 'name': 'Jane Doe', 'occupation': 'teacher'],
['id': 4, 'name': 'Tomas Mudry', 'occupation': 'shopkeeper'],
['id': 5, 'name': 'Paul Smith', 'occupation': 'programmer'],
['id': 6, 'name': 'Roman Nikolaj', 'occupation': 'programmer'],
['id': 7, 'name': 'Lucia Smutna', 'occupation': 'student'],
['id': 8, 'name': 'Kevin Smith', 'occupation': 'manager'],
]
def xmlFile = "report.xml"
def jrReport = JasperCompileManager.compileReport(xmlFile)
def ds = new JRMapCollectionDataSource(users)
def params = [:]
def jrPrint = JasperFillManager.fillReport(jrReport, params, ds)
JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")
This example uses the JRMapCollectionDataSource as the data source.
def users = [
['id': 1, 'name': 'John Doe', 'occupation': 'gardener'],
['id': 2, 'name': 'Roger Roe', 'occupation': 'driver'],
['id': 3, 'name': 'Jane Doe', 'occupation': 'teacher'],
['id': 4, 'name': 'Tomas Mudry', 'occupation': 'shopkeeper'],
['id': 5, 'name': 'Paul Smith', 'occupation': 'programmer'],
['id': 6, 'name': 'Roman Nikolaj', 'occupation': 'programmer'],
['id': 7, 'name': 'Lucia Smutna', 'occupation': 'student'],
['id': 8, 'name': 'Kevin Smith', 'occupation': 'manager'],
]
We define a list of maps. Each map represents user data. The id,
name, and occupation keys are mapped to the template
fields.
def ds = new JRMapCollectionDataSource(users)
From the list of map objects, we create the JRMapCollectionDataSource.
def jrPrint = JasperFillManager.fillReport(jrReport, params, ds)
The data source is passed to the JasperFillManager.fillReport
method.
Map[] users = [
['id': 1, 'name': 'John Doe', 'occupation': 'gardener'],
['id': 2, 'name': 'Roger Roe', 'occupation': 'driver'],
['id': 3, 'name': 'Jane Doe', 'occupation': 'teacher'],
['id': 4, 'name': 'Tomas Mudry', 'occupation': 'shopkeeper'],
['id': 5, 'name': 'Paul Smith', 'occupation': 'programmer'],
['id': 6, 'name': 'Roman Nikolaj', 'occupation': 'programmer'],
['id': 7, 'name': 'Lucia Smutna', 'occupation': 'student'],
['id': 8, 'name': 'Kevin Smith', 'occupation': 'Manager'],
]
def ds = new JRMapArrayDataSource(users)
Alternatively, we can use the JRMapArrayDataSource, which takes
an array of maps.
In this article we have used JRMapArrayDataSource and JRMapCollectionDataSource as data sources in JasperReports library.