JasperReports conditional style
last modified February 12, 2024
In this article we use conditional styling in JasperReports library. Conditional
styles can be set with conditionalStyle
and
conditionExpression
tags.
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 conditional style example
The following application uses a bold text for every second row in the report.
<?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"> <style name="alt"> <conditionalStyle> <conditionExpression> <![CDATA[$V{COLUMN_COUNT} % 2 == 0]]> </conditionExpression> <style isBold="true"/> </conditionalStyle> </style> <field name="name"/> <field name="quantity" class="java.lang.Integer"/> <detail> <band height="20"> <textField> <reportElement x="0" y="0" width="80" height="20" style="alt"/> <textElement textAlignment="Right"/> <textFieldExpression class="java.lang.String"> <![CDATA[$F{name}]]> </textFieldExpression> </textField> <textField> <reportElement x="100" y="0" width="80" height="20" style="alt"/> <textElement textAlignment="Right"/> <textFieldExpression class="java.lang.Integer"> <![CDATA[$F{quantity}]]> </textFieldExpression> </textField> </band> </detail> </jasperReport>
This is the report template file. The report contains two columns.
<style name="alt"> <conditionalStyle> <conditionExpression> <![CDATA[$V{COLUMN_COUNT} % 2 == 0]]> </conditionExpression> <style isBold="true"/> </conditionalStyle> </style>
The conditionalStyle
and conditionExpression
tags are
used to define a conditional style. The $V{COLUMN_COUNT} % 2 == 0
expression applies the style on every second row. The COLUMN_COUNT
is a built-in variable referring to the current row being processed by
JasperReports. (The name of the variable is misleading.)
<staticText> <reportElement mode="Opaque" x="0" y="0" width="260" height="16" style="alt"/> <textElement /> <text><![CDATA[]]> </text> </staticText>
The style is specified with the style
attribute of the
reportElement
; the element must be opaque.
<field name="name"/> <field name="quantity" class="java.lang.Integer"/>;
The fields are mapped to the map keys.
<textField> <reportElement x="60" y="0" width="80" height="16" style="row"/> <textElement /> <textFieldExpression class="java.lang.String"> <![CDATA[$F{Name}]]> </textFieldExpression> </textField>
The value of the Name
field is shown in the textField
using the $F{}
syntax.
@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0') @Grab(group='net.sf.jasperreports', module='jasperreports-fonts', 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.JasperFillManager import net.sf.jasperreports.engine.JasperExportManager import net.sf.jasperreports.engine.data.JRMapCollectionDataSource def data = [ ['name': 'pen', 'quantity': 5], ['name': 'table', 'quantity': 3], ['name': 'book', 'quantity': 20], ['name': 'cup', 'quantity': 7] ] def xmlFile = "report.xml" def jrReport = JasperCompileManager.compileReport(xmlFile) def ds = new JRMapCollectionDataSource(data) def params = [:] def jrPrint = JasperFillManager.fillReport(jrReport, params, ds) JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")
The example generates a report where every second row is displayed in bold.
@Grab(group='net.sf.jasperreports', module='jasperreports-fonts', version='6.21.0')
We need the jasperreports-fonts
library to display text in bold.
def xmlFile = "report.xml" def jrReport = JasperCompileManager.compileReport(xmlFile)
The XML template file is compiled into a JasperReport
.
JasperReport
is a compiled template ready to be filled with data.
def data = [ ['name': 'pen', 'quantity': 5], ['name': 'table', 'quantity': 3], ['name': 'book', 'quantity': 20], ['name': 'cup', 'quantity': 7] ]
The data is a simple list of maps.
def ds = new JRMapCollectionDataSource(data)
The data source is a JRMapCollectionDataSource
.
def params = [:] def jrPrint = JasperFillManager.fillReport(jrReport, params, ds)
A JasperPrint
object is created; an object that can be
viewed, printed, or exported to other formats. We pass the data source to
the JasperFillManager.fillReport
method. There are no
parameters.
JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")
The JasperExportManager.exportReportToPdfFile
method
exports the JasperPrint
into a PDF file.
In this article we have applied conditional styling on a report.