JasperReports - Compilazione Report Design
Abbiamo generato il template JasperReport (file JRXML) nel capitolo precedente. Questo file non può essere utilizzato direttamente per generare rapporti. Deve essere compilato nel formato binario nativo di JasperReport, chiamatoJasperfile. Durante la compilazione, trasformiamo l'oggetto JasperDesign in oggetto JasperReport -
L'interfaccia net.sf.jasperreports.engine.design.JRCompiler gioca un ruolo centrale durante la compilazione. Questa interfaccia ha diverse implementazioni a seconda del linguaggio utilizzato per le espressioni di report, che possono essere scritte in Java, Groovy, JavaScript o qualsiasi altro linguaggio di scripting purché l'implementazione del compilatore possa valutarlo in fase di esecuzione.
Possiamo compilare il file JRXML nei seguenti due modi:
- Compilazione programmatica.
- Compilazione tramite attività ANT.
Compilazione programmatica di JRXML
JasperReports API offre una classe di facciata net.sf.jasperreports.engine.JasperCompileManager per la compilazione di un JasperReport. Questa classe è costituita da diversi metodi statici pubblici per la compilazione di modelli di report. L'origine dei modelli può essere file, flussi di input e / o oggetti di memoria.
I contenuti del file JRXML (jasper_report_template.jrxml) sono i seguenti. Viene salvato nella directoryC:\tools\jasperreports-5.0.1\test -
<?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>
Il codice seguente mostra la compilazione del file jasper_report_template.jrxml precedente .
package com.tutorialspoint;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
public class JasperReportCompile {
public static void main(String[] args) {
String sourceFileName = "C://tools/jasperreports-5.0.1/test" +
"/jasper_report_template.jrxml";
System.out.println("Compiling Report Design ...");
try {
/**
* Compile the report to a file name same as
* the JRXML file name
*/
JasperCompileManager.compileReportToFile(sourceFileName);
} catch (JRException e) {
e.printStackTrace();
}
System.out.println("Done compiling!!! ...");
}
}
Compilazione di modelli
Come passaggio successivo, salviamo il contenuto sopra nel file C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportCompile.javae importare baseBuild.xml nel file build.xml come di seguito. Il file baseBuild.xml ha già l'estensionecompile e run obiettivi -
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "run" basedir = ".">
<import file = "baseBuild.xml"/>
</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.JasperReportCompile come -
C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.JasperReportCompile
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
compile:
[javac] C:\tools\jasperreports-5.0.1\test\baseBuild.xml:27:
warning: 'includeantruntime' was not set, defaulting to
build.sysclasspath=last;set to false for repeatable builds
[javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes
run:
[echo] Runnin class : com.tutorialspoint.JasperReportCompile
[java] Compiling Report Design ...
[java] log4j:WARN No appenders could be found for logger
(net.sf.jasperreports.engine.xml.JRXmlDigesterFactory).
[java] log4j:WARN Please initialize the log4j system properly.
[java] Done compiling!!! ...
BUILD SUCCESSFUL
Total time: 8 seconds
Come risultato della compilazione precedente, vedrai che il file modello jasper_report_template.jasper è stato generato nella directory C: \ tools \ jasperreports-5.0.1 \ test.
Anteprima modello di report compilato
Il net.sf.jasperreports.view.JasperDesignViewer può essere utilizzato per visualizzare in anteprima compilato modelli di report e modelli jrxml.
Per andare oltre, aggiungiamo un nuovo obiettivo viewDesignal file build.xml sopra, che ci consentirà di visualizzare in anteprima il report compilato. Di seguito è riportato il build.xml rivisto:
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 = "viewDesign" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewDesign" description="Design viewer is launched
to preview the compiled report design.">
<java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
<arg value = "-F${file.name}.jasper" />
<classpath refid = "classpath" />
</java>
</target>
</project>
Eseguiamo il comando - ant(viewDesign è la destinazione predefinita) al prompt dei comandi. La finestra di JasperDesignViewer si apre visualizzando il file Jasper come di seguito -
Compilazione tramite ANT Task
Poiché la compilazione del modello di report è più simile a un lavoro in fase di progettazione che a un lavoro in runtime, la libreria JasperReport ha un'attività ANT personalizzata. In alcune situazioni, quando il file JRXML viene creato in fase di esecuzione, non è possibile utilizzare questa attività ANT. L'attività ANT personalizzata si chiama JRC ed è implementata dalla classe: net.sf.jasperreports.ant.JRAntCompileTask . La sua sintassi e il suo comportamento sono molto simili a quelli integrati<javac> Attività ANT.
Compilazione di modelli
Aggiungiamo un nuovo obiettivo compilereportdesingal nostro build.xml esistente. Qui, la cartella di origine viene specificata utilizzando un tag <src> nidificato con i set di file. Il tag di origine nidificato consente di compilare modelli di report distribuiti in molte posizioni diverse e non raggruppati in una singola cartella di origine del report principale. Di seguito è riportato il build.xml rivisto:
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "compilereportdesing" basedir = ".">
<import file = "baseBuild.xml" />
<target name = "viewDesign" description = "Design viewer is
launched to preview the compiled report design.">
<java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
<arg value = "-F${file.name}.jasper" />
<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 il prompt dei comandi e andiamo alla directory in cui si trova build.xml. Esegui il comandoant(compilereportdesing è l'obiettivo predefinito); L'output è il seguente:
C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml
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.
BUILD SUCCESSFUL
Total time: 5 seconds
Il file jasper_report_template.jasper viene generato nel file system (nel nostro caso la directory C: \ tools \ jasperreports-5.0.1 \ test). Questo file è identico al file generato a livello di codice chiamando net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile (). Possiamo vedere in anteprima questo file jasper, in esecuzioneant viewDesign.