JasperReports filtering data tutorial
last modified July 15, 2020
JasperReports filtering data shows how to filter data in a report created with
JasperReports library. Filtering is done using the filterExpression
tag.
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 filter data example
The following application loads data from a bean collection data source and creates a report from it with JasperReports library. The report is a PDF file.
pom.xml src └── main ├── java │ └── com │ └── zetcode │ ├── model │ │ └── Car.java │ └── main │ ├── CommandLineRunner.java │ └── JasperFilterEx.java └── resources └── report2.xml
This is the project structure.
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.zetcode</groupId> <artifactId>filterex</artifactId> <version>1.0-SNAPSHOT</version> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> <exec.mainClass>com.zetcode.main.CommandLineRunner</exec.mainClass> </properties> <dependencies> <dependency> <groupId>net.sf.jasperreports</groupId> <artifactId>jasperreports</artifactId> <version>6.9.0</version> </dependency> </dependencies> </project>
The Maven pom.xml
file contains the
jasperreports
dependency.
package com.zetcode.model; public class Car { private Long id; private String name; private int price; public Car() {} public Car(Long id, String name, int price) { this.id = id; this.name = name; this.price = price; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getPrice() { return price; } public void setPrice(int price) { this.price = price; } @Override public String toString() { return "Car{" + "id=" + id + ", name=" + name + ", price=" + price + '}'; } }
This is Car
bean class. It contains car id, car name, and car price
attributes.
<?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="report2" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <style name="textRight" hAlign="Right" vAlign="Middle" /> <field name="Id" class="java.lang.Long"> <fieldDescription><![CDATA[id]]></fieldDescription> </field> <field name="Name" class="java.lang.String"> <fieldDescription><![CDATA[name]]></fieldDescription> </field> <field name="Price" class="java.lang.Integer"> <fieldDescription><![CDATA[price]]></fieldDescription> </field> <filterExpression> <![CDATA[$F{Price} > 50000]]> </filterExpression> <detail> <band height="15"> <textField> <reportElement x="0" y="0" width="50" height="15" style="textRight" /> <textElement /> <textFieldExpression class="java.lang.Long"> <![CDATA[$F{Id}]]> </textFieldExpression> </textField> <textField> <reportElement x="150" y="0" width="100" height="15" /> <textElement /> <textFieldExpression class="java.lang.String"> <![CDATA[$F{Name}]]> </textFieldExpression> </textField> <textField> <reportElement x="200" y="0" width="100" height="15" style="textRight" /> <textElement /> <textFieldExpression class="java.lang.Integer"> <![CDATA[$F{Price}]]> </textFieldExpression> </textField> </band> </detail> </jasperReport>
This is the report template file. The template contains the detail band, in which each element is repeated for every record provided by the data source.
<field name="Price" class="java.lang.Integer"> <fieldDescription><![CDATA[price]]></fieldDescription> </field>
The Price
field is mapped to the car price
attribute.
<filterExpression> <![CDATA[$F{Price} > 50000]]> </filterExpression>
The filterExpression
tag is used for filtering data. The filtering
expression shows cars whose price is greater than 50000.
<textField> <reportElement x="200" y="0" width="100" height="15" style="textRight" /> <textElement /> <textFieldExpression class="java.lang.Integer"> <![CDATA[$F{Price}]]> </textFieldExpression> </textField>
The Price
field is shown in the textField
tag with the
$F{}
syntax.
package com.zetcode.main; import com.zetcode.model.Car; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperCompileManager; import net.sf.jasperreports.engine.JasperExportManager; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; import java.util.ArrayList; import java.util.HashMap; public class JasperFilterEx { public void start() throws JRException { var xmlFile = "src/main/resources/report2.xml"; var jasperReport = JasperCompileManager.compileReport(xmlFile); var cars = new ArrayList<Car>(); cars.add(new Car(1L, "Audi", 52642)); cars.add(new Car(2L, "Mercedes", 57127)); cars.add(new Car(3L, "Skoda", 9000)); cars.add(new Car(4L, "Volvo", 29000)); cars.add(new Car(5L, "Bentley", 350000)); cars.add(new Car(6L, "Citroen", 21000)); cars.add(new Car(7L, "Hummer", 41400)); cars.add(new Car(8L, "Volkswagen", 21600)); var ds = new JRBeanCollectionDataSource(cars); var params = new HashMap<String, Object>(); var jasperPrint = JasperFillManager.fillReport(jasperReport, params, ds); JasperExportManager.exportReportToPdfFile(jasperPrint, "src/main/resources/report2.pdf"); } }
The JasperFilterEx
creates a JasperPrint
file from
the data source. JasperPrint
represents a page-oriented
document that can be viewed, printed, or exported to other formats.
var xmlFile = "src/main/resources/report2.xml"; var jasperReport = JasperCompileManager.compileReport(xmlFile);
We compile the XML template file into a JasperReport
.
JasperReport
is a compiled template ready to be filled
with data.
var cars = new ArrayList<Car>(); cars.add(new Car(1L, "Audi", 52642)); cars.add(new Car(2L, "Mercedes", 57127)); cars.add(new Car(3L, "Skoda", 9000)); ...
An ArrayList
of cars is our data.
var ds = new JRBeanCollectionDataSource(cars);
JRBeanCollectionDataSource
is a data source implementation
that wraps a collection of Java bean objects. We put four Car
beans into the data source.
var jasperPrint = JasperFillManager.fillReport(jasperReport, params, ds);
A JasperPrint
object is created; an object that can be
viewed, printed, or exported to other formats.
JasperExportManager.exportReportToPdfFile(jasperPrint, "src/main/resources/report2.pdf");
The JasperExportManager.exportReportToPdfFile()
method
exports the JasperPrint
into a PDF file.
package com.zetcode.main; public class CommandLineRunner { public static void main(String[] args) throws Exception { var app = new JasperFilterEx(); app.start(); } }
The CommandLineRunner
sets up the application.
$ mvn exec:java
We run the application.
In this tutorial, we have created a PDF file report with filtered data. List all JasperReports tutorials.