Sezioni del rapporto
Abbiamo discusso la struttura di un semplice modello di report nel capitolo Introduzione . Su linee simili, JasperReports struttura il modello di report in più sezioni. Le sezioni sono parti del report che hanno un'altezza specificata e possono contenere oggetti del report come linee, rettangoli, immagini o campi di testo.
Il motore di report esegue l'iterazione dei record virtuali dell'origine dati del report fornita, al momento del riempimento del report. A seconda del comportamento definito di ciascuna sezione, il motore esegue quindi il rendering di ciascuna sezione del report quando appropriato. Ad esempio, viene eseguito il rendering della sezione dei dettagli per ogni record nell'origine dati. Quando si verificano interruzioni di pagina, viene eseguito il rendering delle sezioni dell'intestazione e del piè di pagina in base alle esigenze.
In JasperReports, la terminologia e le sezioni dei rapporti sono chiamate anche report bands. Le sezioni sono costituite da una o più fasce. Queste sezioni vengono riempite ripetutamente al momento della generazione del rapporto e preparano il documento finale.
Sezioni principali
Un modello di rapporto in JasperReports ha le seguenti sezioni principali:
<title></title>
<pageheader></pageheader>
<columnheader></columnheader>
<groupheader></groupheader>
<detail></detail>
<groupfooter></groupfooter>
<columnfooter></columnfooter>
<pagefooter></pagefooter>
<lastpagefooter></lastpagefooter>
<summary></summary>
<nodata></nodata>
<background></background>
La tabella seguente riassume ciascuna delle sezioni:
S.NO | Sezione e descrizione |
---|---|
1 | Title Questa sezione viene visualizzata solo una volta all'inizio del report. |
2 | Page Header Questa sezione viene visualizzata all'inizio di ogni pagina nel documento generato. |
3 | Column Header Questa sezione viene visualizzata all'inizio di ogni colonna nel documento generato. Se il report ha una sola colonna definita, le sezioni di intestazione e piè di pagina vengono ignorate. |
4 | Group Header Questa sezione è introdotta da un gruppo di report (capitolo Gruppi ). Ogni volta che l'espressione di raggruppamento cambia il suo valore, la sezione dell'intestazione del gruppo viene stampata sopra la sezione dei dettagli. Nel caso in cui sia definito più di un gruppo, l'intestazione del gruppo viene stampata nell'ordine di definizione del gruppo. |
5 | Detail Questa sezione viene ripetuta per ogni riga di dati fornita dall'origine dati del report. La sezione dei dettagli può essere composta da più fasce. |
6 | Group Footer Questa sezione è introdotta da un gruppo di report (capitolo Gruppi ). La sezione del piè di pagina del gruppo viene stampata sotto la sezione dei dettagli prima che il valore dell'espressione di raggruppamento cambi. Il piè di pagina del gruppo viene sempre stampato per l'ultima riga di dati nell'origine dati. Nel caso in cui sia definito più di un gruppo, il piè di pagina del gruppo viene stampato nell'ordine inverso rispetto alla definizione del gruppo. |
7 | Column Footer Questa sezione viene visualizzata nella parte inferiore di ogni colonna. Se il conteggio delle colonne del report è 1, le sezioni di intestazione e piè di pagina vengono ignorate. |
8 | Page Footer Questa sezione viene visualizzata in fondo a ciascuna pagina. |
9 | Last Page Footer Questa sezione sostituisce il normale piè di pagina nell'ultima pagina del report. Nel caso in cui sia presente anche la sezione di riepilogo, questa potrebbe non essere l'ultima pagina del documento. Questa sezione è talvolta utile quando le informazioni di riepilogo devono essere visualizzate nella parte inferiore dell'ultima pagina. |
10 | Summary Questa sezione viene visualizzata solo una volta alla fine del report. |
11 | No Data Questa sezione viene stampata quando la proprietà del report Quando non è possibile stampare dati è impostata su Nessuna sezione dati . Se la sezione <noData> è definita nel modello di report e se l'origine dati è vuota, la sezione <noData> sarà l'unica presa in considerazione al momento del riempimento e il suo contenuto produrrà l'output del report. |
12 | Background La sezione dello sfondo viene visualizzata in ogni pagina e non può passare alla pagina successiva. Gli elementi inseriti in questa sezione vengono valutati al momento dell'inizializzazione della pagina e vengono visualizzati in background. Tutti gli altri oggetti della pagina vengono visualizzati sopra gli oggetti di sfondo. Questa sezione è utile per creare filigrane di pagina. |
Sezione, elementi e relazione tra attributi
Il diagramma seguente mostra la relazione tra elementi e attributi in una sezione di un report.
Elementi della sezione
Tutte le sezioni del report sopra menzionate sono facoltative. Ma qualsiasi modello di rapporto avrà almeno una di queste sezioni. Ciascuna di queste sezioni contiene un singolo <band> elemento come suo unico sottoelemento. A <band> può contenere zero o più sottoelementi seguenti -
<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> o <elementGroup>
Ciascuno di questi elementi deve contenere un singolo <reportElement> come primo elemento (eccetto elementGroup). A <reportElement> determina la disposizione dei dati per quel particolare elemento. A differenza delle variabili e dei parametri, gli elementi del report non devono avere un nome, perché normalmente non è necessario ottenere alcun singolo elemento all'interno di un modello di report.
La tabella seguente riassume gli attributi di <reportElement> -
Attributo | Descrizione | Valori validi |
---|---|---|
X | Specifica la coordinata x dell'elemento banda. | Un valore intero che indica la coordinata x dell'elemento in pixel. Questo attributo è obbligatorio. |
y | Specifica la coordinata y dell'elemento banda. | Un valore intero che indica la coordinata y dell'elemento in pixel. Questo attributo è obbligatorio. |
larghezza | Specifica la larghezza dell'elemento banda. | Un valore intero che indica la larghezza dell'elemento in pixel. Questo attributo è obbligatorio. |
altezza | Specifica l'altezza dell'elemento fascia. | Un valore intero che indica l'altezza dell'elemento in pixel. Questo attributo è obbligatorio. |
chiave | Identificatore univoco dell'elemento della banda. | Un valore stringa univoco. |
stretchType | Specifica come si allunga l'elemento quando si allunga la fascia che lo contiene | NoStretch (default) - L'elemento non si allungherà. RelativeToTallestObject - L'elemento si allungherà per accogliere l'oggetto più alto nel suo gruppo. RelativeToBand - L'elemento si allungherà per adattarsi all'altezza della fascia. |
positionType | Specifica la posizione dell'elemento quando la fascia si allunga. | Float - L'elemento si sposterà a seconda delle dimensioni degli elementi circostanti. FixRelativeToTop (default) - L'elemento manterrà una posizione fissa rispetto alla parte superiore della fascia. FixRelativeToBottom - L'elemento manterrà una posizione fissa rispetto al fondo della fascia. |
isPrintRepeatedValues | Specifica se vengono stampati valori ripetuti. | true (default) - Verranno stampati valori ripetuti. false - I valori ripetuti non verranno stampati. |
modalità | Specifica la modalità di sfondo dell'elemento | Opaco, Trasparente |
isRemoveLineWhenBlank | Specifica se l'elemento deve essere rimosso quando è vuoto e non sono presenti altri elementi nello stesso spazio orizzontale. | vero falso |
isPrintInFirstWholeBand | Specifica se l'elemento deve essere stampato in un'intera fascia, ovvero una fascia non divisa tra le pagine o le colonne del report. | vero falso |
isPrintWhenDetailOverFlows | Specifica se l'elemento verrà stampato quando la banda trabocca su una nuova pagina o colonna. | vero falso |
printWhenGroupChanges | Specifica che l'elemento verrà stampato quando il gruppo specificato cambia. | Un valore stringa. |
forecolor | Specifica il colore di primo piano dell'elemento. | Un valore RGB esadecimale preceduto dal carattere # o uno dei seguenti valori predefiniti: nero, blu, ciano, grigio scuro, grigio, verde, grigio chiaro, magenta, arancione, rosa, rosso, giallo, bianco. |
colore di sfondo | Specifica il colore di sfondo dell'elemento. | Uguale ai valori validi per il colore anteriore |
Attributi di sezione
Di seguito sono riportati gli attributi di una sezione del report:
Altezza
L'altezza della sezione specifica l'altezza in pixel per quella particolare sezione ed è molto importante nella progettazione complessiva del report.
Stampa quando espressione
Un'espressione booleana che determina se la sezione deve essere stampata o meno.
Divisione consentita
Un flag che indica se la sezione può essere divisa quando non si adatta alla pagina corrente. Se vero, la sezione verrà trasferita alla pagina successiva. Si noti che nel caso in cui la sezione non si adatti alla pagina successiva, la sezione verrà divisa indipendentemente dal valore del flag. splitType può assumere i seguenti valori:
splitType = "Stretch:" Divide il contenuto allungato. Se la sezione si estende sulla pagina corrente (se lo spazio disponibile è inferiore all'altezza dichiarata), l'area che viene aggiunta all'altezza originale può essere suddivisa nella pagina successiva.
splitType = "Prevent:" Impedisce la divisione al primo tentativo. Se la sezione non rientra nella pagina successiva, la divisione avviene normalmente, poiché la prevenzione della divisione della banda è efficace solo al primo tentativo di divisione.
splitType = "Immediate:" Dividi immediatamente. La band può dividersi ovunque tranne che sopra, il suo elemento più in alto.
Esempio
Per dimostrare ogni sezione, scriviamo un modello di rapporto (jasper_report_template.jrxml). Salva questo file inC:\tools\jasperreports-5.0.1\testdirectory. In questo file, visualizzeremo un testo in ciascuna delle sezioni (abbiamo discusso sopra). I contenuti del file sono i seguenti:
<?xml version = "1.0" encoding = "UTF-8"?>
<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 = "300" pageHeight = "300"
columnWidth = "300" leftMargin = "0" rightMargin = "0"
topMargin = "0" bottomMargin = "0" >
<title>
<band height = "50">
<textField>
<reportElement x = "100" y = "16" width = "100" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Title"]]>
</textFieldExpression>
</textField>
</band>
</title>
<pageHeader>
<band height = "40">
<textField>
<reportElement mode = "Opaque" x = "100" y = "10"
width = "90" height = "20"/>
<textElement>
<font isBold = "true"/>
</textElement>
<textFieldExpression>
<![CDATA["Page Header"]]>
</textFieldExpression>
</textField>
</band>
</pageHeader>
<columnHeader>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement>
<font isItalic = "true"/>
</textElement>
<textFieldExpression>
<![CDATA["Column Header"]]>
</textFieldExpression>
</textField>
</band>
</columnHeader>
<detail>
<band height ="40">
<textField>
<reportElement mode = "Opaque" x = "100" y = "10"
width = "90" height = "20" backcolor = "#99CCFF"/>
<textElement/>
<textFieldExpression>
<![CDATA["Report Details"]]>
</textFieldExpression>
</textField>
</band>
</detail>
<columnFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Column Footer"]]>
</textFieldExpression>
</textField>
</band>
</columnFooter>
<pageFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Page Footer"]]>
</textFieldExpression>
</textField>
</band>
</pageFooter>
<lastPageFooter>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Last Page Footer"]]>
</textFieldExpression>
</textField>
</band>
</lastPageFooter>
<summary>
<band height = "40">
<textField>
<reportElement x = "100" y = "10" width = "90" height = "20"/>
<textElement/>
<textFieldExpression>
<![CDATA["Summary"]]>
</textFieldExpression>
</textField>
</band>
</summary>
</jasperReport>
Di seguito viene fornito il codice java per compilare e generare il report. Salviamo questo fileJasperReportFill.java nella directory C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.
package com.tutorialspoint;
import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
public class JasperReportFill {
public static void main(String[] args) {
String sourceFileName = "C://tools/jasperreports-5.0.1/test/" +
"jasper_report_template.jasper";
try {
JasperFillManager.fillReportToFile(sourceFileName, null,
new JREmptyDataSource());
} catch (JRException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Qui, utilizziamo un'istanza di JREmptyDataSource durante la compilazione dei report per simulare un'origine dati con un record al suo interno, ma con tutti i campi in questo singolo record nulli.
Generazione di report
Compileremo ed eseguiremo il file sopra utilizzando il nostro normale processo di compilazione ANT. I contenuti del file build.xml (salvato nella directory C: \ tools \ jasperreports-5.0.1 \ test) sono i seguenti.
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 è la destinazione predefinita) come segue:
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, defau
[javac] Compiling 1 source file 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.JRXmlDigesterFac
[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.ExtensionsEnviro
[java] log4j:WARN Please initialize the log4j system properly.
viewFillReport:
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.extensions.ExtensionsEnviro
[java] log4j:WARN Please initialize the log4j system properly.
BUILD SUCCESSFUL
Total time: 18 minutes 22 seconds
Come risultato della compilazione sopra, si apre una finestra di JasperViewer come nella schermata qui sotto -
Qui, possiamo vedere in ciascuna delle sezioni che viene stampato un testo. È da notare che poiché JRXML contiene un elemento <lastPageFooter>, verrà visualizzato nell'ultima pagina del report invece dell'elemento <pageFooter> visualizzato. Gli elementi <columnHeader> e <columnFooter> verranno visualizzati solo nel report, se ha più di una colonna.