JasperReports – Fields

Reports Fields ”; Previous Next Report fields are elements, which represent mapping of data between datasource and report template. Fields can be combined in the report expressions to obtain the desired output. A report template can contain zero or more <field> elements. When declaring report fields, the data source should supply data corresponding to all the fields defined in the report template. Field Declaration Field declaration is done as shown below − <field name = “FieldName” class = “java.lang.String”/> The Name Attribute The name attribute of the <field> element is mandatory. It references the field in report expressions by name. The Class Attribute The class attribute specifies the class name for the field values. Its default value is java.lang.String. This can be changed to any class available at runtime. Irrespective of the type of a report field, the engine takes care of casting in the report expressions in which the $F{} token is used, hence making manual casts unnecessary. Field Description The <fieldDesciption> element is an optional element. This is very useful when implementing a custom data source. For example, we can store a key or some information, by which we can retrieve the value of field from the custom data source at runtime. By using the <fieldDesciption> element instead of the field name, you can easily overcome restrictions of field-naming conventions when retrieving the field values from the data source. Following is a piece of code from our existing JRXML file (Chapter Report Designs). Here, we can see usage of name, class, and fieldDescription elements. <field name = “country” class = “java.lang.String”> <fieldDescription><![CDATA[country]]></fieldDescription> </field> <field name = “name” class = “java.lang.String”> <fieldDescription><![CDATA[name]]></fieldDescription> </field> Sort Fields At the times when data sorting is required and the data source implementation doesn”t support it (for e.g. CSV datasource), JasperReports supports in-memory field-based data source sorting. The sorting can be done using one or more <sortField> elements in the report template. If at least one sort field is specified, during report filling process, the data source is passed to a JRSortableDataSource instance. This in turn, fetches all the records from data source, performs in memory sort according to the specified fields, and replaces the original data source. The sort field name should be identical to the report field name. Fields used for sorting should have types that implement java.util.Comparable. Natural order sorting is performed for all fields except those of type java.lang.String (for String type, collator corresponding to the report fill locale is used). When several sort Fields are specified, the sorting will be performed using the fields as sort keys in the order in which they appear in the report template. Following example demonstrates the sorting feature. Sorted Report Example Let”s add the <sortField> element to our existing report template (Chapter Report designs). Let”s sort field country in descending order. The revised report template (jasper_report_template.jrxml) is as follows. Save it to C:toolsjasperreports-5.0.1test directory − <?xml version = “1.0”?> <!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 = “jasper_report_template” pageWidth = “595” pageHeight = “842” columnWidth = “515” leftMargin = “40” rightMargin = “40” topMargin = “50” bottomMargin = “50”> <parameter name = “ReportTitle” class = “java.lang.String”/> <parameter name = “Author” class = “java.lang.String”/> <queryString> <![CDATA[]]> </queryString> <field name = “country” class = “java.lang.String”> <fieldDescription><![CDATA[country]]></fieldDescription> </field> <field name = “name” class = “java.lang.String”> <fieldDescription><![CDATA[name]]></fieldDescription> </field> <sortField name = “country” order = “Descending”/> <sortField name = “name”/> <title> <band height = “70”> <line> <reportElement x = “0” y = “0” width = “515” height = “1”/> </line> <textField isBlankWhenNull = “true” bookmarkLevel = “1”> <reportElement x = “0” y = “10” width = “515” height = “30”/> <textElement textAlignment = “Center”> <font size = “22”/> </textElement> <textFieldExpression class = “java.lang.String”> <![CDATA[$P{ReportTitle}]]> </textFieldExpression> <anchorNameExpression> <![CDATA[“Title”]]> </anchorNameExpression> </textField> <textField isBlankWhenNull = “true”> <reportElement x = “0” y = “40” width = “515” height = “20”/> <textElement textAlignment = “Center”> <font size = “10”/> </textElement> <textFieldExpression class = “java.lang.String”> <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <columnHeader> <band height = “23”> <staticText> <reportElement mode = “Opaque” x = “0” y = “3” width = “535” height = “15” backcolor = “#70A9A9” /> <box> <bottomPen lineWidth = “1.0” lineColor = “#CCCCCC” /> </box> <textElement /> <text> <![CDATA[]]> </text> </staticText> <staticText> <reportElement x = “414” y = “3” width = “121” height = “15” /> <textElement textAlignment = “Center” verticalAlignment = “Middle”> <font isBold = “true” /> </textElement> <text><![CDATA[Country]]></text> </staticText> <staticText> <reportElement x = “0” y = “3” width = “136” height = “15” /> <textElement textAlignment = “Center” verticalAlignment = “Middle”> <font isBold = “true” /> </textElement> <text><![CDATA[Name]]></text> </staticText> </band> </columnHeader> <detail> <band height = “16”> <staticText> <reportElement mode = “Opaque” x = “0” y = “0” width = “535” height = “14” backcolor = “#E5ECF9” /> <box> <bottomPen lineWidth = “0.25” lineColor = “#CCCCCC” /> </box> <textElement /> <text> <![CDATA[]]> </text> </staticText> <textField> <reportElement x = “414” y = “0” width = “121” height = “15” /> <textElement textAlignment = “Center” verticalAlignment = “Middle”> <font size = “9” /> </textElement> <textFieldExpression class = “java.lang.String”> <![CDATA[$F{country}]]> </textFieldExpression> </textField> <textField> <reportElement x = “0” y = “0” width = “136” height = “15” /> <textElement textAlignment = “Center” verticalAlignment = “Middle” /> <textFieldExpression class = “java.lang.String”> <![CDATA[$F{name}]]> </textFieldExpression> </textField> </band> </detail> </jasperReport> The java codes for report filling remains unchanged. The contents of the file C:toolsjasperreports-5.0.1testsrccomtutorialspointJasperReportFill.java are as given below − package com.tutorialspoint; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; public class JasperReportFill { @SuppressWarnings(“unchecked”) public static void main(String[] args) { String sourceFileName = “C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper”; DataBeanList DataBeanList = new DataBeanList(); ArrayList<DataBean> dataList = DataBeanList.getDataBeanList(); JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataList); Map parameters = new HashMap(); /** * Passing ReportTitle and Author as parameters */ parameters.put(“ReportTitle”, “List of Contacts”); parameters.put(“Author”, “Prepared By Manisha”); try { JasperFillManager.fillReportToFile( sourceFileName, parameters, beanColDataSource); } catch (JRException e) { e.printStackTrace(); } } } The contents of the POJO file C:toolsjasperreports-5.0.1testsrccomtutorialspointDataBean.java are as given below − package com.tutorialspoint; public

JasperReports – Fillings

JasperReports – Filling Reports ”; Previous Next The main purpose of any reporting tool is to produce high quality documents. Report filling process helps reporting tool to achieve this by manipulating sets of data. The main inputs required for report-filling process are − Report Template − This is actual JasperReport file. Report Parameters − These are basically named values that are passed at the report filling time to the engine. We will discuss them in Report Parameter chapter. Data Source − We can fill a Jasper file from a range of datasources like an SQL query, an XML file, a csv file, an HQL (Hibernate Query Language) query, a collection of Java Beans, etc. This will be discussed in detail in Report Data Sources chapter. The output generated by this process is a .jrprint document which is ready to be viewed, printed, or exported to other formats. The facade class net.sf.jasperreports.engine.JasperFillManager is usually used for filling a report template with data. This class has various fillReportXXX() methods that fill report templates (templates could be located on disk, picked from input streams, or are supplied directly as in-memory). There are two categories of fillReportXXX() methods in this facade class − The first type, receive a java.sql.Connection object as the third parameter. Most of the times, reports are filled with data from a relational database. This is achieved by − Connect to the database through JDBC. Include an SQL query inside the report template. JasperReports engine uses the connection passed in and executes the SQL query. A report data source is thus produced for filling the report. The second type, receive a net.sf.jasperreports.engine.JRDataSource object, when the data that need to be filled is available in other forms. Filling Report Templates Let”s write a report template. The contents of the JRXML file (C:toolsjasperreports-5.0.1testjasper_report_template.jrxml) are as below − <?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 = “jasper_report_template” language = “groovy” pageWidth = “595” pageHeight = “842” columnWidth = “555” leftMargin = “20” rightMargin = “20” topMargin = “20” bottomMargin = “20”> <queryString> <![CDATA[]]> </queryString> <field name = “country” class = “java.lang.String”> <fieldDescription><![CDATA[country]]></fieldDescription> </field> <field name = “name” class = “java.lang.String”> <fieldDescription><![CDATA[name]]></fieldDescription> </field> <columnHeader> <band height = “23”> <staticText> <reportElement mode = “Opaque” x = “0” y = “3” width = “535” height = “15” backcolor = “#70A9A9” /> <box> <bottomPen lineWidth = “1.0” lineColor = “#CCCCCC” /> </box> <textElement /> <text><![CDATA[]]> </text> </staticText> <staticText> <reportElement x = “414” y = “3” width = “121” height = “15” /> <textElement textAlignment = “Center” verticalAlignment = “Middle”> <font isBold = “true” /> </textElement> <text><![CDATA[Country]]></text> </staticText> <staticText> <reportElement x = “0” y = “3” width = “136” height = “15” /> <textElement textAlignment = “Center” verticalAlignment = “Middle”> <font isBold = “true” /> </textElement> <text><![CDATA[Name]]></text> </staticText> </band> </columnHeader> <detail> <band height = “16”> <staticText> <reportElement mode = “Opaque” x = “0” y = “0” width = “535” height = “14” backcolor = “#E5ECF9” /> <box> <bottomPen lineWidth = “0.25” lineColor = “#CCCCCC” /> </box> <textElement /> <text><![CDATA[]]> </text> </staticText> <textField> <reportElement x = “414” y = “0” width = “121” height = “15” /> <textElement textAlignment = “Center” verticalAlignment = “Middle”> <font size = “9” /> </textElement> <textFieldExpression class = “java.lang.String”> <![CDATA[$F{country}]]> </textFieldExpression> </textField> <textField> <reportElement x = “0” y = “0” width = “136” height = “15” /> <textElement textAlignment = “Center” verticalAlignment = “Middle” /> <textFieldExpression class = “java.lang.String”> <![CDATA[$F{name}]]> </textFieldExpression> </textField> </band> </detail> </jasperReport> Next, let”s pass a collection of Java data objects (Java beans), to the JasperReport Engine, to fill this compiled report. Write a POJO DataBean.java, which represents the data object (Java bean). This class defines two String objects i.e. ”name” and ”country”. Save it to the directory C:toolsjasperreports-5.0.1testsrccomtutorialspoint. package com.tutorialspoint; public class DataBean { private String name; private String country; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getCountry() { return country; } public void setCountry(String country) { this.country = country; } } Write a class DataBeanList.java, which has business logic to generate a collection of java bean objects. This is further passed to the JasperReports engine, to generate the report. Here we are adding 4 DataBean objects in the List. Save it to the directory C:toolsjasperreports-5.0.1testsrccomtutorialspoint. package com.tutorialspoint; import java.util.ArrayList; public class DataBeanList { public ArrayList<DataBean> getDataBeanList() { ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>(); dataBeanList.add(produce(“Manisha”, “India”)); dataBeanList.add(produce(“Dennis Ritchie”, “USA”)); dataBeanList.add(produce(“V.Anand”, “India”)); dataBeanList.add(produce(“Shrinath”, “California”)); return dataBeanList; } /** * This method returns a DataBean object, * with name and country set in it. */ private DataBean produce(String name, String country) { DataBean dataBean = new DataBean(); dataBean.setName(name); dataBean.setCountry(country); return dataBean; } } Write a main class file JasperReportFill.java, which gets the java bean collection from the class (DataBeanList) and passes it to the JasperReports engine, to fill the report template. Save it to the directory C:toolsjasperreports-5.0.1testsrccomtutorialspoint. package com.tutorialspoint; import java.util.ArrayList; import java.util.HashMap; import java.util.Map; import net.sf.jasperreports.engine.JRException; import net.sf.jasperreports.engine.JasperFillManager; import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; public class JasperReportFill { @SuppressWarnings(“unchecked”) public static void main(String[] args) { String sourceFileName = “c://tools/jasperreports-5.0.1/test/jasper_report_template.jasper”; DataBeanList DataBeanList = new DataBeanList(); ArrayList<DataBean> dataList = DataBeanList.getDataBeanList(); JRBeanCollectionDataSource beanColDataSource = new JRBeanCollectionDataSource(dataList); Map parameters = new HashMap(); try { JasperFillManager.fillReportToFile( sourceFileName, parameters, beanColDataSource); } catch (JRException e) { e.printStackTrace(); } } } Generating Reports We will now compile and execute these files using our regular ANT build process. The build.xml file is as given below − The import file – baseBuild.xml is picked from chapter Environment Setup and should be placed in the same directory as the build.xml. <?xml version = “1.0” encoding = “UTF-8”?> <project name = “JasperReportTest” default = “executereport” basedir = “.”> <import file = “baseBuild.xml”/> <target name = “executereport” depends = “compile,compilereportdesing,run”> <echo message = “Im here”/> </target> <target name = “compilereportdesing” description = “Compiles the JXML file and produces the .jasper file.”> <taskdef name = “jrc” classname = “net.sf.jasperreports.ant.JRAntCompileTask”> <classpath refid = “classpath” /> </taskdef> <jrc destdir