Learn how to handle scenarios with no data in JasperReports. This tutorial provides practical steps for generating empty reports gracefully.
last modified February 12, 2024
JasperReports noData tutorial shows how to generate report when no data is available.
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.
The noData section can be used in a report when the datasource is empty. When there is no data, JasperReports generates a blank page. To generate the noData section with empty datasource, we define the section in the report and set the whenNoDataType of the jasperReport tag to NoDataSection. (The default is BlankPage).
The following application generates the noData section when there is an empty datasource.
report.xml
<?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" whenNoDataType=“NoDataSection” name=“report” topMargin=“20” bottomMargin=“20”>
<field name="id" class="java.lang.Long"/>
<field name="name"/>
<field name="price" class="java.lang.Integer"/>
<detail>
<band height="15">
<textField>
<reportElement x="0" y="0" width="50" height="15"/>
<textElement textAlignment="Right" verticalAlignment="Middle"/>
<textFieldExpression class="java.lang.Long">
<![CDATA[$F{id}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x="150" y="0" width="100" height="15" />
<textElement textAlignment="Left" verticalAlignment="Middle"/>
<textFieldExpression class="java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x="200" y="0" width="100" height="15" />
<textElement textAlignment="Right" verticalAlignment="Middle"/>
<textFieldExpression class="java.lang.Integer">
<![CDATA[$F{price}]]>
</textFieldExpression>
</textField>
</band>
</detail>
<noData>
<band height="15">
<staticText>
<reportElement x="0" y="0" width="200" height="15"/>
<box>
<bottomPen lineWidth="1.0" lineColor="#CCCCCC"/>
</box>
<textElement />
<text><![CDATA[The report has no data]]></text>
</staticText>
</band>
</noData>
</jasperReport>
This is the report template file. The template contains the detail band and the noData band. The former is generated when there is some data, the latter when there is no data.
<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" whenNoDataType=“NoDataSection” name=“report” topMargin=“20” bottomMargin=“20”>
The whenNoDataType attribute is set to NoDataSection. By default, the attribute is set to blankPage.
<noData> <band height=“15”> <staticText> <reportElement x=“0” y=“0” width=“200” height=“15”/> <box> <bottomPen lineWidth=“1.0” lineColor="#CCCCCC”/> </box> <textElement /> <text><![CDATA[The report has no data]]></text> </staticText> </band> </noData>
The noData contains a static text that is displayed in case there is no data. The static text says: The report has no data.
report.gvy
@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.JasperFillManager import net.sf.jasperreports.engine.JasperExportManager import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource import groovy.transform.Immutable
@Immutable class Car { Long id; String name; int price; }
def data = [ new Car(1L, ‘Audi’, 52642), new Car(2L, ‘Mercedes’, 57127), new Car(3L, ‘Skoda’, 9000), new Car(4L, ‘Volvo’, 29000), new Car(5L, ‘Bentley’, 350000), new Car(6L, ‘Citroen’, 21000), new Car(7L, ‘Hummer’, 41400), new Car(8L, ‘Volkswagen’, 21600), ]
def empty = []
def xmlFile = “report.xml”
def jrReport = JasperCompileManager.compileReport(xmlFile) def ds = new JRBeanCollectionDataSource(empty)
def params = [:] def jrPrint = JasperFillManager.fillReport(jrReport, params, ds)
JasperExportManager.exportReportToPdfFile(jrPrint, “report.pdf”)
We have two lists; one of them is empty. Depending on which container we pass to the JRBeanCollectionDataSource, the report either generates data from the detail band or the message The report has no data.
In this article we have presented the noData section of JasperReports.
My name is Jan Bodnar, and I am a passionate programmer with extensive programming experience. I have been writing programming articles since 2007. To date, I have authored over 1,400 articles and 8 e-books. I possess more than ten years of experience in teaching programming.