Segnala espressione
Le espressioni dei report sono le potenti funzionalità di JasperReports, che ci consentono di visualizzare i dati calcolati in un report. I dati calcolati sono i dati che non sono dati statici e non vengono specificatamente passati come parametro del report o campo dell'origine dati. Le espressioni di report vengono create combinando parametri di report, campi e dati statici. Il linguaggio Java viene utilizzato per la scrittura di espressioni di report per impostazione predefinita. Altri linguaggi di scripting per espressioni di report come il linguaggio di scripting Groovy, JavaScript o lo script BeanShell sono supportati dai compilatori JasperReports.
Questo capitolo spiegherà come funzionano le espressioni di report, assumendo che siano state scritte utilizzando solo il linguaggio Java. In un modello di rapporto JRXML, sono presenti diversi elementi che definiscono le espressioni come:
- <variableExpression>
- <initialValueExpression>
- <groupExpression>
- <printWhenExpression>
- <imageExpression>
- <textFieldExpression>
Dichiarazione di espressione
Fondamentalmente, tutte le espressioni di report sono espressioni Java, che possono fare riferimento a campi di report, variabili di report e parametri di report.
Riferimento di campo nell'espressione
Per utilizzare un riferimento a un campo del report in un'espressione, è necessario inserire il nome del campo $F{e} sequenze di caratteri, come mostrato di seguito -
<textfieldexpression>
$F{Name}
</textfieldexpression>
Di seguito è riportato un pezzo di codice dal nostro file JRXML esistente (capitolo Report Design) -
<textFieldExpression class = "java.lang.String">
<![CDATA[$F{country}]]>
</textFieldExpression>
Riferimento variabile nell'espressione
Per fare riferimento a una variabile in un'espressione, è necessario inserire il nome della variabile tra $V{e} come mostrato nell'esempio riportato di seguito -
<textfieldexpression>
"Total height : " + $V{SumOfHeight} + " ft."
</textfieldexpression>
Riferimento ai parametri in Expression
Per fare riferimento a un parametro in un'espressione, il nome del parametro deve essere inserito tra $P{e} come mostrato nell'esempio riportato di seguito -
<textfieldexpression>
"ReportTitle : " + $P{Title}
</textfieldexpression>
Di seguito è riportato un pezzo di codice dal nostro file JRXML esistente, che dimostra il riferimento a un parametro in un'espressione. (JRXML dal capitolo Report Designs ) -
<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>
Come hai visto sopra, i riferimenti a parametri, campi e variabili sono in realtà oggetti Java reali. Conoscendo la loro classe dalla dichiarazione di parametro, campo o variabile fatta nel modello di report, possiamo persino chiamare metodi su quei riferimenti a oggetti nelle espressioni.
Il seguente esempio mostra - come estrarre e visualizzare la prima lettera dal campo del rapporto java.lang.String "Nome" -
<textFieldExpression>
$F{Name}.substring(0, 1)
</textFieldExpression>
Riferimento al pacchetto di risorse in Expression
Per fare riferimento a una risorsa in un'espressione, la chiave deve essere inserita tra$R{e} come mostrato nell'esempio riportato di seguito -
<textfieldexpression>
$R{report.title}
</textfieldexpression>
In base alle impostazioni internazionali fornite dal runtime e alla chiave report.title , viene caricato il bundle di risorse associato al modello di report. Pertanto, il titolo del report viene visualizzato estraendo il valore String dal bundle di risorse. Maggiori informazioni sull'internazionalizzazione possono essere trovate nel capitolo Internazionalizzazione .
Calcolatrice
Calcolatrice è un'entità in JasperReports, che valuta espressioni e incrementa variabili o set di dati al momento della compilazione del rapporto. Durante il processo di compilazione, le informazioni vengono prodotte e memorizzate nel rapporto di compilazione dal compilatore. Queste informazioni vengono utilizzate durante il tempo di compilazione del report per creare un'istanza della classe net.sf.jasperreports.engine.fill.JRCalculator.
Il file di origine Java viene generato e compilato al volo da compilatori di report basati su Java. Questa classe generata è una sottoclasse del JRCalculator e il bytecode prodotto dalla sua compilazione viene memorizzato all'interno dell'oggetto JasperReport. Questo bytcode viene caricato al momento del riempimento del report e la classe risultante viene istanziata per ottenere l'oggetto calcolatore necessario per la valutazione dell'espressione.
Espressioni condizionali
JasperReports non supporta le istruzioni if-else durante la definizione delle espressioni di variabili. Invece, puoi usare gli operatori ternari{cond} ? {statement 1} : {statement 2}. Questo operatore può essere annidato all'interno di un'espressione Java per ottenere l'output desiderato in base a più condizioni.
Esempio di espressione condizionale nel report
Modifichiamo il modello di report esistente (Chapter Report Design ) e aggiungiamo un'espressione condizionale per il paese del campo. Il modello di rapporto rivisto (jasper_report_template.jrxml) è il seguente. Salvalo nella directory C: \ tools \ jasperreports-5.0.1 \ test -
<?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}.isEmpty() ? "NO COUNTRY" : $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>
I codici Java per la compilazione del report sono i seguenti. Il contenuto del fileC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java sono come -
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();
}
}
}
Il contenuto del file POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java sono come -
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;
}
}
Aggiungeremo un nuovo record con il campo country vuoto nel nostro Java bean List. Il contenuto del fileC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java sono come -
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"));
dataBeanList.add(produce("Tanmay", ""));
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;
}
}
Generazione di report
Compileremo ed eseguiremo il file sopra utilizzando il nostro normale processo di compilazione ANT. Di seguito sono riportati i contenuti del file build.xml (salvato nella directory C: \ tools \ jasperreports-5.0.1 \ test).
Il file di importazione - baseBuild.xml viene prelevato dal capitolo Configurazione dell'ambiente e dovrebbe essere posizionato nella stessa directory di build.xml.
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewFillReport" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewFillReport" depends = "compile,compilereportdesing,run"
description = "Launches the report viewer to preview
the report stored in the .JRprint file.">
<java classname = "net.sf.jasperreports.view.JasperViewer" fork = "true">
<arg value = "-F${file.name}.JRprint" />
<classpath refid = "classpath" />
</java>
</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 = ".">
<src>
<fileset dir = ".">
<include name = "*.jrxml" />
</fileset>
</src>
<classpath refid = "classpath" />
</jrc>
</target>
</project>
Quindi, apriamo la finestra della riga di comando e andiamo alla directory in cui si trova build.xml. Infine, esegui il comandoant -Dmain-class = com.tutorialspoint.JasperReportFill (viewFullReport è il target predefinito) come -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperReportFill
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
clean-sample:
[delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jasper
[delete] Deleting: C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrprint
compile:
[mkdir] Created dir: C:\tools\jasperreports-5.0.1\test\classes
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:28:
warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last;
set to false for repeatable builds
[javac] Compiling 3 source files to C:\tools\jasperreports-5.0.1\test\classes
compilereportdesing:
[jrc] Compiling 1 report design files.
[jrc] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[jrc] log4j:WARN Please initialize the log4j system properly.
[jrc] log4j:WARN See
http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
[jrc] File : C:\tools\jasperreports-5.0.1\test\jasper_report_template.jrxml ... OK.
run:
[echo] Runnin class : com.tutorialspoint.JasperReportFill
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnvironment).
[java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 5 minutes 5 seconds
C:\tools\jasperreports-5.0.1\test>
Come risultato della compilazione di cui sopra, si apre una finestra di JasperViewer come mostrato nella schermata sotto riportata -
Qui, possiamo vedere, per l'ultimo record, non abbiamo passato alcun dato per il campo paese, "NO COUNTRY" viene stampato.