JasperReports - Compilando Design de Relatório
Geramos o modelo JasperReport (arquivo JRXML) no capítulo anterior. Este arquivo não pode ser usado diretamente para gerar relatórios. Ele deve ser compilado no formato binário nativo JasperReport, chamadoJasperArquivo. Na compilação, transformamos o objeto JasperDesign em objeto JasperReport -
A interface net.sf.jasperreports.engine.design.JRCompiler desempenha um papel central durante a compilação. Essa interface tem várias implementações dependendo da linguagem usada para expressões de relatório, que podem ser escritas em Java, Groovy, JavaScript ou qualquer outra linguagem de script, desde que a implementação do compilador possa avaliá-la em tempo de execução.
Podemos compilar o arquivo JRXML das duas maneiras a seguir -
- Compilação programática.
- Compilação através da tarefa ANT.
Compilação programática de JRXML
A API JasperReports oferece uma classe de fachada net.sf.jasperreports.engine.JasperCompileManager para compilar um JasperReport. Esta classe consiste em vários métodos estáticos públicos para compilar modelos de relatório. A fonte de modelos pode ser arquivos, fluxos de entrada e / ou objetos de memória.
O conteúdo do arquivo JRXML (jasper_report_template.jrxml) é o seguinte. É salvo no diretórioC:\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>
O código a seguir demonstra a compilação do arquivo jasper_report_template.jrxml acima .
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!!! ...");
}
}
Compilação de modelo
Na próxima etapa, vamos salvar o conteúdo acima no arquivo C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportCompile.javae importe o baseBuild.xml no arquivo build.xml conforme abaixo. O baseBuild.xml já tem ocompile e run alvos -
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "run" basedir = ".">
<import file = "baseBuild.xml"/>
</project>
A seguir, vamos abrir a janela da linha de comando e ir para o diretório onde build.xml está colocado. Finalmente, execute o comandoant -Dmain-class = com.tutorialspoint.JasperReportCompile como -
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
Como resultado da compilação acima, você verá que o arquivo de modelo jasper_report_template.jasper foi gerado no diretório C: \ tools \ jasperreports-5.0.1 \ test.
Pré-visualizar modelo de relatório compilado
O net.sf.jasperreports.view.JasperDesignViewer pode ser usado para visualizar modelos de relatórios compilados e modelos JRXML.
Para ir mais longe, vamos adicionar um novo alvo viewDesignpara o arquivo build.xml acima, o que nos permitirá visualizar o relatório compilado. Abaixo está o build.xml revisado -
O arquivo de importação - baseBuild.xml é escolhido no capítulo Configuração do ambiente e deve ser colocado no mesmo diretório que o 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>
Vamos executar o comando - ant(viewDesign é o destino padrão) no prompt de comando. A janela JasperDesignViewer abre exibindo o arquivo Jasper conforme abaixo -
Compilação por meio de tarefa ANT
Como a compilação do modelo de relatório é mais como um trabalho de tempo de design do que um trabalho de tempo de execução, a biblioteca JasperReport tem uma tarefa ANT personalizada. Para certas situações, quando o arquivo JRXML é criado em tempo de execução, não podemos usar esta tarefa ANT. A tarefa ANT customizada é chamada JRC e é implementada pela classe: net.sf.jasperreports.ant.JRAntCompileTask . Sua sintaxe e comportamento são muito semelhantes aos<javac> Tarefa ANT.
Compilação de modelo
Vamos adicionar um novo alvo compilereportdesingao nosso build.xml existente. Aqui, a pasta de origem é especificada usando uma tag <src> aninhada com os conjuntos de arquivos. A marca de origem aninhada permite compilar modelos de relatório que estão espalhados por muitos locais diferentes e não são agrupados em uma única pasta raiz de origem de relatório. Abaixo está o build.xml revisado -
<?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>
A seguir, vamos abrir o prompt de comando e ir para o diretório onde build.xml está colocado. Execute o comandoant(compilereportdesing é o destino padrão); O resultado é o seguinte -
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
O arquivo jasper_report_template.jasper é gerado no sistema de arquivos (em nosso caso, o diretório C: \ tools \ jasperreports-5.0.1 \ test). Esse arquivo é idêntico ao arquivo gerado programaticamente, chamando net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile (). Podemos visualizar este arquivo jasper, executandoant viewDesign.