JasperReports - Составление дизайна отчета
Мы сгенерировали шаблон JasperReport (файл JRXML) в предыдущей главе. Этот файл нельзя использовать напрямую для создания отчетов. Он должен быть скомпилирован в собственный двоичный формат JasperReport, называемыйJasperфайл. При компиляции мы преобразуем объект JasperDesign в объект JasperReport -
Интерфейс net.sf.jasperreports.engine.design.JRCompiler играет центральную роль во время компиляции. Этот интерфейс имеет несколько реализаций в зависимости от языка, используемого для выражений отчетов, которые могут быть написаны на Java, Groovy, JavaScript или любом другом языке сценариев, если реализация компилятора может оценивать его во время выполнения.
Мы можем скомпилировать файл JRXML следующими двумя способами:
- Программная компиляция.
- Компиляция через задачу ANT.
Программная компиляция JRXML
API JasperReports предлагает фасадный класс net.sf.jasperreports.engine.JasperCompileManager для компиляции JasperReport. Этот класс состоит из нескольких общедоступных статических методов для компиляции шаблонов отчетов. Источником шаблонов могут быть файлы, входные потоки и / или объекты памяти.
Содержимое файла JRXML (jasper_report_template.jrxml) выглядит следующим образом. Он сохраняется в каталогеC:\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>
Следующий код демонстрирует компиляцию указанного выше файла jasper_report_template.jrxml .
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!!! ...");
}
}
Компиляция шаблона
В качестве следующего шага давайте сохраним вышеуказанный контент в файле C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportCompile.javaи импортируйте baseBuild.xml в файл build.xml, как показано ниже. В baseBuild.xml уже естьcompile и run цели -
<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "run" basedir = ".">
<import file = "baseBuild.xml"/>
</project>
Затем давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class = com.tutorialspoint.JasperReportCompile как -
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
В результате вышеуказанной компиляции вы увидите, что файл шаблона jasper_report_template.jasper был создан в каталоге C: \ tools \ jasperreports-5.0.1 \ test.
Предварительный просмотр шаблона скомпилированного отчета
Net.sf.jasperreports.view.JasperDesignViewer может быть использован для предварительного просмотра скомпилирован шаблонов отчетов и шаблонов JRXML.
Чтобы двигаться дальше, добавим новую цель viewDesignв указанный выше файл build.xml, который позволит нам предварительно просмотреть скомпилированный отчет. Ниже приведен исправленный build.xml -
Файл импорта - baseBuild.xml выбирается из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>
Выполняем команду - ant(viewDesign - цель по умолчанию) в командной строке. Откроется окно JasperDesignViewer, в котором отображается файл Jasper, как показано ниже -
Компиляция через ANT Task
Поскольку компиляция шаблона отчета больше похожа на задание времени разработки, чем на выполнение задания, библиотека JasperReport имеет настраиваемую задачу ANT. В определенных ситуациях, когда файл JRXML создается во время выполнения, мы не можем использовать эту задачу ANT. Специальная задача ANT называется JRC и реализуется классом net.sf.jasperreports.ant.JRAntCompileTask . Его синтаксис и поведение очень похожи на встроенный<javac> Задача ANT.
Компиляция шаблона
Добавим новую цель compilereportdesingв наш существующий build.xml. Здесь исходная папка указывается с помощью вложенного тега <src> с наборами файлов. Вложенный тег источника позволяет компилировать шаблоны отчетов, которые разбросаны по разным местам и не сгруппированы в одной корневой папке источника отчетов. Ниже приведен исправленный build.xml -
<?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>
Затем давайте откроем командную строку и перейдем в каталог, в котором размещен build.xml. Выполнить командуant(цель по умолчанию - compilereportdesing); Выход выглядит следующим образом -
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
Файл jasper_report_template.jasper создается в файловой системе (в нашем случае каталог C: \ tools \ jasperreports-5.0.1 \ test). Этот файл идентичен файлу, созданному программно путем вызова net.sf.jasperreports.engine.JasperCompileManager.compileReportToFile (). Мы можем предварительно просмотреть этот файл jasper, выполнивant viewDesign.