Учебники

JasperReports — Составление дизайна отчетов

Мы сгенерировали шаблон JasperReport (файл JRXML) в предыдущей главе. Этот файл нельзя использовать напрямую для создания отчетов. Он должен быть скомпилирован в собственный двоичный формат JasperReport, называемый файлом Jasper . При компиляции мы преобразуем объект JasperDesign в объект JasperReport —

Jasper Report Compiling

Интерфейс net.sf.jasperreports.engine.design.JRCompiler играет центральную роль во время компиляции. Этот интерфейс имеет несколько реализаций в зависимости от языка, используемого для выражений отчета, который может быть написан на Java, Groovy, JavaScript или любом другом языке сценариев, если реализация компилятора может оценить его во время выполнения.

Мы можем скомпилировать файл JRXML следующими двумя способами:

  • Программная компиляция.
  • Компиляция через задачу ANT.

Программная компиляция JRXML

JasperReports API предлагает класс фасада 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 уже есть цели компиляции и запуска

<?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, как показано ниже:

Jasper Design Viewer

Компиляция через 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 (). Мы можем просмотреть этот файл яшмы, выполнив ant viewDesign .