JasperReports - Краткое руководство

Что такое отчет

Отчет - это содержательное, четко определенное и обобщенное представление информации. Обычно рутинные действия автоматизируются, а данные суммируются в «Отчеты» для поддержки принятия решений. Отчеты представляют обычные беспорядочные данные в виде диаграмм, графиков и других форм графического представления.

Шаблон отчета

Как правило, для создания отчетов большинством коммерческих инструментов создания отчетов используется следующая схема.

ЗАГЛАВИЕ
ЗАГОЛОВОК СТРАНИЦЫ
КОЛОННАХ
ДЕТАЛИ
КОЛОННА
СТРАНИЦА
РЕЗЮМЕ

Ниже приведены описания каждого элемента, упомянутого на диаграмме.

S.NO Элемент и описание
1

title

Заголовок содержит заголовок отчета. Он появляется только один раз в самом начале отчета, например, «Отчет по учебным точкам».

2

pageHeader

Заголовок страницы может содержать информацию о дате и времени и / или название организации. Он отображается вверху каждой страницы.

3

columnHeader

ColumnHeader перечисляет имена тех конкретных полей, которые вы хотите отобразить в отчете, например, «Имя автора», «Начальный час», «Конечный час», «Часы работы», «Дата» и т. Д.

4

detail

Деталь - это часть, где отображаются записи определенных полей (перечисленных в столбцеHeader), например «Маниша», «9:00», «18:00», «9», «10.02.2013».

5

columnFooter

ColumnFooter может отображать сумму любого поля, например, «Общее количество отработанных часов:« 180 ».

6

pageFooter

PageFooter может содержать информацию о количестве страниц. Он отображается внизу каждой страницы, например «1/23».

7

summary

Сводка содержит информацию, полученную из «подробной» части, например, после перечисления количества часов, отработанных каждым автором, общее количество часов, отработанных каждым автором, может быть помещено в визуальную диаграмму, такую ​​как круговая диаграмма, график и т.д.

JasperReports

Ниже приведены типичные проблемы, с которыми сталкиваются во время разработки отчета.

  • Core changes - Обычно для отражения бизнес-изменений или улучшений требуется изменить основную логику отчета.

  • Results exporting - Существует широкий спектр форматов, в которые можно экспортировать отчет, например: HTML, текст, PDF, MS Excel, RTF, ODT, значения, разделенные запятыми, XML или изображения.

  • Complicated reports - Подотчеты и отчеты с перекрестными таблицами являются хорошим примером.

  • Charts reports - Визуальные диаграммы, например, график, круговая диаграмма, линия XY, столбец, метр и временной ряд.

Чтобы убрать накладные расходы по вышеупомянутым пунктам и облегчить процесс отчетности, было введено множество фреймворков, инструментов, библиотек и сторонних приложений. JasperReports один из них.

JasperReportsэто движок отчетов Java с открытым исходным кодом. Он основан на Java и не имеет собственного синтаксиса выражений. JasperReports может доставлять богатое содержимое на экран, на принтер или в файлы PDF, HTML, XLS, RTF, ODT, CSV, TXT и XML. Поскольку это не отдельный инструмент, его нельзя установить отдельно. Вместо этого он встраивается в приложения Java, включая свою библиотеку в CLASSPATH приложения.

JasperReports - это библиотека классов Java, которая не предназначена для конечных пользователей, а скорее предназначена для разработчиков Java, которым необходимо добавить возможности отчетности в свои приложения.

Особенности JasperReports

Некоторые из важных особенностей JasperReports:

  • Имеет гибкий макет отчета.

  • Он может представлять данные в текстовом или графическом виде.

  • Разработчики могут предоставлять данные разными способами.

  • Он может принимать данные из нескольких источников данных.

  • Он может создавать водяные знаки (водяной знак похож на вторичное изображение, которое накладывается на основное изображение).

  • Он может создавать подотчеты.

  • Он может экспортировать отчеты в различные форматы.

JasperReports - это чистая библиотека Java, а не отдельное приложение. Он не может работать сам по себе, поэтому его необходимо встроить в другое клиентское или серверное Java-приложение. Поскольку он основан на Java, его можно запустить на любой платформе, поддерживающей Java (JDK 1.3 и выше). Все функции JasperReport собраны в одном файле JAR, jasperreports-xxxjar. Этот JAR вместе с необходимыми и дополнительными библиотеками (файл .ZIP) можно загрузить с сайта: Ссылка на библиотеку JasperReport . Загрузите последнюю версию по этой ссылке.

ZIP-файл включает JAR-файл JasperReports вместе с исходным кодом JasperReports, зависимыми JAR-файлами и множеством примеров, демонстрирующих функциональные возможности JasperReport.

Среда JasperReport

Чтобы приступить к созданию отчетов, нам нужно настроить среду. Распакуйте загруженный файл JasperReport.ZIP в любое место (в нашем случае мы распаковали его в C: \ tools \ jasperreports-5.0.1). Структура каталогов извлеченного файла такая же, как показано ниже -

Вот подробности всех каталогов -

  • build - содержит скомпилированные файлы классов JasperReport.

  • demo - содержит различные примеры, демонстрирующие несколько аспектов функциональности JasperReports.

  • dist - содержит файл jasperreports-xxxjar. Мы добавим этот JAR-файл в наш CLASSPATH, чтобы воспользоваться JasperReports.

  • docs - содержит локальную копию документации JasperReports.

  • lib - содержит все файлы JAR, необходимые как для создания JasperReports, так и для использования в наших приложениях.

  • src - содержит исходный код JasperReports.

  • build.xml - файл сборки ANT для сборки исходного кода JasperReports. Если мы не собираемся изменять JasperReports, нам не нужно использовать этот файл, поскольку JasperReports распространяется в скомпилированной форме.

  • changes.txt - текстовый документ, объясняющий различия между текущей и предыдущей версиями библиотеки классов JasperReports.

  • license.txt - текстовый документ, содержащий полный текст лицензии LGPL (Lesser General Public License).

  • readme.txt - текстовый документ, содержащий инструкции по созданию и выполнению предоставленных примеров.

По сути, мы используем только jasperreports-xxxjar в dist и JAR в каталоге lib для создания отчетов. Поскольку JasperReports является инструментом с открытым исходным кодом, если во время выполнения в jasperreports-xxxjar обнаруживается какой-либо дефект или ошибка, мы можем исправить это и снова построить JAR, используя файл build.xml.

Установите CLASSPATH

Чтобы использовать JasperReport, нам нужно установить следующие файлы в наш CLASSPATH -

  • jasperreports-xxxjar, где xxx - версия JasperReports. Это находится в каталоге C: \ tools \ jasperreports-xxx \ dist).

  • Все файлы JAR в подкаталоге lib (C: \ tools \ jasperreports-xxx \ lib).

На момент установки мы использовали JasperReport версии 5.0.1. Щелкните правой кнопкой мыши «Мой компьютер» и выберите «Свойства», затем нажмите кнопку «Переменные среды» на вкладке «Дополнительно». Теперь обновите переменную "Путь" этимC:\tools\jasperreports-5.0.1\dist\jasperreports-5.0.1.jar:C:\tools\jasperreports-5.0.1\lib. Теперь вы готовы создавать свои отчеты.

Во всех примерах этого руководства мы использовали задачи ANT для создания отчетов. Вbuildfile заботится об импорте всех необходимых JAR для создания отчетов. Следовательно, установка CLASSPATH, как упомянуто выше, поможет только тем, кто хочет создавать отчеты без использования ANT.

Настройка сборки

Все примеры в этом руководстве -

  • были написаны с использованием простого текстового редактора.

  • были сохранены в каталоге C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

  • были скомпилированы и выполнены из командной строки с использованием Apache ANT. Мы будем использоватьbaseBuild.xml файл, который мы импортируем в ANT build.xmlфайл в последующих главах. Сохраните этот файл в C: \ tools \ jasperreports-5.0.1 \ test. Ниже приводится содержимое файла baseBuild.xml -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportExample" basedir = ".">
   <description>Previews our JasperReport XML Design</description>
   <property name = "file.name" value = "jasper_report_template" />
   
   <!-- Directory where the JasperReports project file was extracted
   needs to be changed to match the local environment -->
   <property name = "jasper.dir" value = "../" />
   <property name = "dist.dir" value = "${jasper.dir}/dist" /> <property name = "lib.dir" value = "${jasper.dir}/lib" />
   <property name = "src.dir" value = "src" />
   <property name = "classes.dir" value = "classes" />
   <property name = "main-class" value = "com.tutorialspoint.HelpMe" />

   <path id = "classpath">
      <pathelement location = "./" />
      <pathelement location = "${classes.dir}" /> <fileset dir = "${lib.dir}">
         <include name = "**/*.jar" />
      </fileset>
	  
      <fileset dir = "${dist.dir}"> <include name = "**/*.jar" /> </fileset> </path> <target name = "compile" depends = "clean-sample"> <mkdir dir = "${classes.dir}"/>
		
      <javac srcdir = "${src.dir}" destdir = "${classes.dir}" 
         classpathref = "classpath" />
   </target>
   
   <target name = "run" depends = "compile">
      <echo message = "Running class : ${main-class}"/> <java fork = "true" classname = "${main-class}">
         <classpath>
            <path refid = "classpath" />
         </classpath>
      </java>
   </target>
   
   <target name = "clean-sample">
      <delete dir = "${classes.dir}" /> <delete file = "./${file.name}.jasper" />
      <delete file = "./${file.name}.jrprint" />
   </target>
   
</project>

Этот файл имеет все необходимые цели, такие как очистка каталогов, компиляция файлов java и выполнение файлов классов.

Ниже приведены подробности, упомянутые в различных каталогах в baseBuild.xml. Предполагая, что текущий каталог - C: \ tools \ jasperreports-5.0.1 \ test) -

  • jasper.dir - это каталог C: \ tools \ jasperreports-5.0.1

  • lib.dir - это каталог C: \ tools \ jasperreports-5.0.1 \ lib

  • src.dir - это C: \ tools \ jasperreports-5.0.1 \ test \ src

  • classes.dir - это C: \ tools \ jasperreports-5.0.1 \ test \ classes

  • основной класс - com.tutorialspoint.HelpMe. Этот класс представляет собой простой класс, выполняемый, когда имя файла класса не передается из командной строки. Сохраните этот файл в папку C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

public class HelpMe {
   public static void main(String[] args) {
      System.out.println("This is the default class executed."
         + "Please pass the fully qualified class" + " name to be executed as command line"
         + " parameter, for example," + " com.tutorialspoint.HelpMe ");
   }
}

Классы менеджеров Джаспера

Существует ряд классов, которые будут использоваться для компиляции дизайна отчета JRXML, для заполнения отчета, для печати отчета, для экспорта в файлы PDF, HTML и XML, просмотра созданных отчетов и дизайна отчета.

Список этих классов -

  • net.sf.jasperreports.engine.JasperCompileManager - используется для компиляции шаблона отчета JRXML.

  • net.sf.jasperreports.engine.JasperFillManager - используется для заполнения отчета данными из источника данных.

  • net.sf.jasperreports.engine.JasperPrintManager - используется для печати документов, созданных библиотекой JasperReports.

  • net.sf.jasperreports.engine.JasperExportManager - используется для получения содержимого PDF, HTML или XML для документов, созданных в процессе заполнения отчета.

  • net.sf.jasperreports.view.JasperViewer - представляет собой простое приложение Java Swing, которое может загружать и отображать отчеты.

  • net.sf.jasperreports.view.JasperDesignViewer - используется во время разработки для предварительного просмотра шаблонов отчетов.

Настройка Apache ANT

Мы собираемся собрать все примеры, используя Apache ANT. Итак, пожалуйста, ознакомьтесь с главой ANT - Environment Setup, чтобы настроить Apache ANT в вашей системе.

Основная цель JasperReports - создавать страничные, готовые к печати документы простым и гибким способом. На следующей блок-схеме показан типичный рабочий процесс при создании отчетов.

Как показано на изображении, жизненный цикл состоит из следующих отдельных фаз:

  • Разработка отчета. На этом этапе мы создаем файл JRXML, который представляет собой XML-документ, содержащий определение макета отчета. Мы можем использовать любой текстовый редактор или iReportDesigner, чтобы создать его вручную. Если используется iReportDesigner, макет создается визуально, поэтому реальную структуру JRXML можно игнорировать.

  • Компиляция отчета - на этом этапе JRXML компилируется в двоичный объект, называемый файлом Jasper (* .jasper). Эта компиляция сделана из соображений производительности. Файлы Jasper - это то, что вам нужно поставлять вместе с вашим приложением для запуска отчетов.

  • Выполнение отчета (Заполнение данных в отчете) - На этом шаге данные из приложения заполняются в скомпилированный отчет. Класс net.sf.jasperreports.engine.JasperFillManager предоставляет необходимые функции для заполнения данных в отчетах. Создается файл печати Jasper (* .jrprint), который можно использовать для печати или экспорта отчета.

  • Экспорт отчета в желаемый формат - на этом шаге мы можем экспортировать файл печати Jasper, созданный на предыдущем шаге, в любой формат с помощью JasperExportManager. Поскольку Jasper предоставляет различные формы экспорта, следовательно, с одним и тем же вводом мы можем создать несколько представлений данных.

Подробный обзор каждого из вышеперечисленных шагов будет дан в следующих главах.

Шаблоны JRXML (или файлы JRXML) в JasperReport представляют собой стандартные файлы XML с расширением .jrxml. Все файлы JRXML содержат тег <jasperReport> в качестве корневого элемента. Это, в свою очередь, содержит множество подэлементов (все они необязательны). Фреймворк JasperReport может обрабатывать различные типы источников данных. В этом руководстве мы покажем, как создать базовый отчет, просто передав коллекцию объекта данных Java (с использованием компонентов Java) в JasperReport Engine. В окончательном отчете должен быть отображен список людей с указанием категорий, включая их имена и страны.

В этой главе описаны следующие шаги - как создать JasperReport -

  • Создание шаблона отчета JRXML и.
  • Предварительный просмотр шаблона отчета XML.

Создание шаблона отчета JRXML

Создайте файл 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>

Вот подробности основных полей в приведенном выше шаблоне отчета -

  • <queryString> - пусто (поскольку мы передаем данные через Java Beans). Обычно содержит оператор SQL, который возвращает результат отчета.

  • <имя поля> - этот элемент используется для отображения данных из источников данных или запросов в шаблоны отчетов. name повторно используется в теле отчета с учетом регистра.

  • <fieldDescription> - этот элемент сопоставляет имя поля с соответствующим элементом в XML-файле.

  • <staticText> - определяет статический текст, который не зависит от каких-либо источников данных, переменных, параметров или выражений отчета.

  • <textFieldExpression> - определяет внешний вид поля результата.

  • $ F {страна} - это переменная, которая содержит значение результата, предопределенного поля в теге <имя поля>.

  • <band> - Бэнды содержат данные, которые отображаются в отчете.

Когда дизайн отчета будет готов, сохраните его в каталоге C: \.

Предварительный просмотр шаблона отчета XML

В JAR-файле JasperReports имеется служебная программа net.sf.jasperreports.view.JasperDesignViewer , которая помогает предварительно просматривать дизайн отчета без необходимости его компиляции или заполнения. Эта утилита представляет собой отдельное приложение Java, поэтому может выполняться с использованием ANT.

Напишем цель ANT viewDesignXMLдля просмотра JRXML. Итак, создадим и сохранимbuild.xmlв каталоге C: \ tools \ jasperreports-5.0.1 \ test (должен находиться в том же каталоге, где находится JRXML). Вот файл build.xml -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "viewDesignXML" basedir = ".">

   <import file = "baseBuild.xml" />
   <target name = "viewDesignXML" description = "Design viewer is 
      launched to preview the JXML report design.">
      
      <java classname = "net.sf.jasperreports.view.JasperDesignViewer" fork = "true">
         <arg value = "-XML" />
         <arg value = "-F${file.name}.jrxml" />
         <classpath refid = "classpath" />
      </java>
   </target>

</project>

Затем давайте откроем командную строку и перейдем в каталог, в котором находится build.xml. Выполнить командуant(Поскольку viewDesignXML является целью по умолчанию). Выход следующий -

C:\tools\jasperreports-5.0.1\test>ant
Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

viewDesignXML:
[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.

Предупреждение Log4j можно игнорировать, и в результате выполнения выше открывается окно с надписью «JasperDesignViewer», в котором отображается предварительный просмотр нашего шаблона отчета.

Как мы видим, отображаются только выражения отчета для получения данных, поскольку JasperDesignViewer не имеет доступа к фактическому источнику данных или параметрам отчета. Завершите JasperDesignViewer, закрыв окно или нажав Ctrl-c в окне командной строки.

Мы сгенерировали шаблон 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.

Основная цель любого инструмента отчетности - подготовка документов высокого качества. Процесс заполнения отчета помогает инструменту отчетности достичь этого, манипулируя наборами данных.

Основные входные данные, необходимые для процесса заполнения отчета:

  • Report Template - Это актуальный файл JasperReport.

  • Report Parameters- По сути, это именованные значения, которые передаются механизму во время заполнения отчета. Мы обсудим их в главе « Параметры отчета» .

  • Data Source- Мы можем заполнить файл Jasper из ряда источников данных, таких как запрос SQL, файл XML, файл csv, запрос HQL (Hibernate Query Language), коллекция Java Beans и т. Д. Это будет подробно обсуждено в отчете Глава Источники данных .

Результатом этого процесса является .jrprint документ, готовый к просмотру, печати или экспорту в другие форматы. Класс фасада net.sf.jasperreports.engine.JasperFillManager обычно используется для заполнения шаблона отчета данными. Этот класс имеет различные методы fillReportXXX (), которые заполняют шаблоны отчетов (шаблоны могут находиться на диске, выбираться из входных потоков или поставляться непосредственно в памяти).

В этом классе фасада есть две категории методов fillReportXXX ():

  • Первый тип получает объект java.sql.Connection в качестве третьего параметра. В большинстве случаев отчеты заполняются данными из реляционной базы данных. Это достигается за счет -

    • Подключитесь к базе данных через JDBC.

    • Включите SQL-запрос в шаблон отчета.

    • Механизм JasperReports использует переданное соединение и выполняет SQL-запрос.

    • Таким образом создается источник данных отчета для заполнения отчета.

  • Второй тип - получить объект net.sf.jasperreports.engine.JRDataSource, когда данные, которые необходимо заполнить, доступны в других формах.

Заполнение шаблонов отчетов

Напишем шаблон отчета. Содержимое файла JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) выглядит следующим образом:

<?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>

Затем давайте передадим коллекцию объектов данных Java (Java beans) в JasperReport Engine для заполнения этого скомпилированного отчета.

Напишите POJO DataBean.java, который представляет объект данных (Java bean). Этот класс определяет два объекта String, то есть «имя» и «страну». Сохраните его в каталогC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Напишите класс DataBeanList.java, в котором есть бизнес-логика для создания коллекции объектов bean-компонентов Java. Далее он передается механизму JasperReports для создания отчета. Здесь мы добавляем 4 объекта DataBean в список. Сохраните его в каталогC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Напишите файл основного класса JasperReportFill.java, который получает коллекцию Java-компонентов из класса (DataBeanList) и передает ее механизму JasperReports для заполнения шаблона отчета. Сохраните его в каталогC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "c://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);
      Map parameters = new HashMap();
      try {
         JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Создание отчетов

Теперь мы скомпилируем и выполним эти файлы, используя наш обычный процесс сборки ANT. Файл build.xml приведен ниже -

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и build.xml.

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "executereport" depends = "compile,compilereportdesing,run">
      <echo message = "Im here"/>
   </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 -Dmain-class = com.tutorialspoint.JasperReportFill (executereport является целью по умолчанию) следующим образом -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class = com.tutorialspoint.JasperReportFill
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.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 8 seconds

В результате выполнения, описанного выше, файл jasper_report_template.jrprint создается в том же каталоге, что и файл .jasper (в этом случае он создается в C: \ tools \ jasperreports-5.0.1 \ test).

Результаты процесса заполнения отчета Объекты JasperPrint можно просматривать с помощью встроенного компонента средства просмотра, распечатывать или экспортировать в более популярные форматы документов, такие как PDF, HTML, RTF, XLS, ODT, CSV или XML. Просмотр и печать документов Jasper будут обсуждаться в этой главе, а экспорт будет обсуждаться в следующей главе, то есть «Экспорт отчетов».

Просмотр отчетов

JasperReport предоставляет встроенную программу просмотра для просмотра сгенерированных отчетов в исходном формате. Это компонент на основе Swing, и другие приложения Java могут интегрировать этот компонент без необходимости экспортировать документы в другие форматы для просмотра или печати. Этот визуальный компонент представляет класс net.sf.jasperreports.view.JRViewer . Этот класс также можно настроить в соответствии с потребностями приложения, создав подклассы.

JasperReports также имеет приложение Swing, которое использует визуальный компонент для просмотра отчетов. Это приложение помогает просматривать отчеты в том же формате, что и * .jrprint. Это приложение Swing реализовано в классе net.sf.jasperreports.view.JasperViewer . Чтобы просматривать отчеты с использованием этого класса, нам нужно обернуть его в цель ANT.

Просмотр сформированного отчета

В следующем примере показано - как просмотреть отчет с помощью класса JasperViewer -

Напишем шаблон отчета. Содержимое файла JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) показано ниже -

<?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>

Затем давайте передадим коллекцию объектов данных Java (Java beans) в JasperReports Engine, чтобы заполнить этот скомпилированный отчет.

Напишите POJO DataBean.java, который представляет объект данных (Java bean). Этот класс определяет два объекта String, то есть «имя» и «страну». Сохраните его в каталогC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Напишите класс DataBeanList.java, в котором есть бизнес-логика для создания коллекции объектов bean-компонентов Java. Далее он передается механизму JasperReports для создания отчета. Здесь мы добавляем 4 объекта DataBean в список. Сохраните его в каталогC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Напишите файл основного класса JasperReportFill.java, который получает коллекцию Java-компонентов из класса (DataBeanList) и передает ее механизму JasperReports для заполнения шаблона отчета. Сохраните его в каталогC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "c://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
         JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Напишем цель viewFillReportв файл build.xml. Файл build.xml выглядит следующим образом -

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните команду ant -Dmain-class=com.tutorialspoint.JasperReportFill(viewFillReport - цель по умолчанию). В результате мы видим окно JasperViewer, как показано на приведенном ниже экране -

Печать отчетов

Мы можем распечатать документы, созданные библиотекой JasperReports (в их собственном формате, например, объекты JasperPrint ), используя класс net.sf.jasperreports.engine.JasperPrintManager . Это фасадный класс, основанный на API печати Java 2. Мы также можем распечатать документы после того, как документы JasperReport будут экспортированы в другие форматы, такие как HTML или PDF.

Печать сгенерированного отчета

Следующий код демонстрирует печать отчета. Давайте обновим наш существующий класс JasperReportFill. Мы будем использовать метод JasperPrintManager.printReport () . Этот метод принимает имя исходного файла (здесь мы передаем файл .jrprint , который мы сгенерировали на предыдущем шаге с помощью метода JasperFillManager.fillReportToFile ()) в качестве первого параметра. Второй параметр - это логическое значение для отображения стандартного диалогового окна печати (мы установили для него значениеtrue Вот).

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrintManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = "c://tools/jasperreports-5.0.1/" +
         "test/jasper_report_template.jasper";
      String printFileName = null;
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
    	   printFileName = JasperFillManager.fillReportToFile( 
            sourceFileName, parameters, beanColDataSource);
         if(printFileName != null){
            JasperPrintManager.printReport( printFileName, true);
         }
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Теперь давайте сохраним этот файл в каталог C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint. Мы скомпилируем и выполним этот файл с помощью ANT. Содержимое build.xml приведено ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "executereport" depends = "compile,compilereportdesing,run">
      <echo message = "Im here"/>
   </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 -Dmain-class=com.tutorialspoint.JasperReportPrint. В результате появится диалоговое окно печати. Щелкните ОК, чтобы распечатать документ.

В предыдущей главе мы видели, как распечатать и просмотреть документ, созданный JasperReport. Здесь мы увидим, как преобразовать или экспортировать эти отчеты в другие форматы, такие как PDF, HTML и XLS. Класс фасада net.sf.jasperreports.engine.JasperExportManager предназначен для достижения этой функциональности. Экспорт означает преобразование объекта JasperPrint (файла .jrprint) в другой формат.

Следующий код (JasperReportExport.java) демонстрирует процесс экспорта документа JasperReport. JasperExportManager предоставляет методы для экспорта отчета только в PDF, HTML и XML. Для экспорта в формат XLS мы использовали класс net.sf.jasperreports.engine.export.JRXlsExporter . Этот код генерирует следующие три файла -

  • sample_report.pdf
  • sample_report.html
  • sample_report.xls

Экспорт в другие форматы

Напишем шаблон отчета. Содержимое файла JRXML (C: \ tools \ jasperreports-5.0.1 \ test \ jasper_report_template.jrxml) выглядит следующим образом:

<?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>

Затем содержимое файла POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java приведены ниже -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Содержимое файла C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Напишите файл основного класса JasperReportFill.java, который получает коллекцию Java-компонентов из класса (DataBeanList) и передает ее механизму JasperReports для заполнения шаблона отчета. Сохраните его в каталогC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint.

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.JRXlsExporter;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = "c://tools/jasperreports-5.0.1/"
         + "test/jasper_report_template.jasper";
      String printFileName = null;
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
      JRBeanCollectionDataSource beanColDataSource =
         new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      try {
         printFileName = JasperFillManager.fillReportToFile(sourceFileName,
            parameters, beanColDataSource);
         if (printFileName != null) {
            /**
             * 1- export to PDF
             */
            JasperExportManager.exportReportToPdfFile(printFileName,
               "C://sample_report.pdf");

            /**
             * 2- export to HTML
             */
            JasperExportManager.exportReportToHtmlFile(printFileName,
               "C://sample_report.html");

            /**
             * 3- export to Excel sheet
             */
            JRXlsExporter exporter = new JRXlsExporter();

            exporter.setParameter(JRExporterParameter.INPUT_FILE_NAME,
               printFileName);
            exporter.setParameter(JRExporterParameter.OUTPUT_FILE_NAME,
               "C://sample_report.xls");

            exporter.exportReport();
         }
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Здесь мы включили логику для экспорта файла печати jasper в форматы pdf, html и xls.

Создание отчетов

Давайте скомпилируем и выполним указанные выше файлы, используя наш обычный процесс сборки ANT. Файл build.xml приведен ниже -

<?xml version = "1.0" encoding = "UTF-8"?>
<project name = "JasperReportTest" default = "executereport" basedir = ".">
   <import file = "baseBuild.xml"/>

   <target name = "executereport" depends = "compile,compilereportdesing,run">
      <echo message = "Im here"/>
   </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>

Перейдите в командную строку, а затем перейдите в каталог C: \ tools \ jasperreports-5.0.1 \ test, где находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFill. Результат выглядит следующим образом -

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, defaulting t
   [javac] Compiling 4 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

executereport:
   [echo] Im here

BUILD SUCCESSFUL
Total time: 32 seconds

В результате выполнения вышеупомянутого вы найдете три файла sample_report.pdf, sample_report.html, sample_report.xls, сгенерированные в каталоге C: \.

Основными входами для заполнения отчета являются - шаблон отчета, параметры и источники данных. В этой главе будут описаны параметры, а в следующей главе мы обсудим источники данных.

Параметры - это ссылки на объекты, которые передаются механизму отчетов во время операций заполнения отчетов. Данные, которые нельзя передать через источник данных, можно передать с помощью параметров. Такие данные, как имя автора, заголовок отчета и т. Д., Могут передаваться через параметры. Шаблон JasperReports или шаблон JRXML может иметь ноль или более элементов параметров.

Объявление параметров

Объявление параметра следующим образом -

<parameter name = "exampleParameter" class = "java.lang.String" />

Атрибут имени

Имя атрибут элемента <параметр> является обязательным. Он ссылается на параметр в выражениях отчета по имени. Название параметра должно состоять из одного слова. Он не должен содержать специальных символов, таких как точка или запятая.

Атрибут класса

Класса атрибут также является обязательной и определяет имя класса для значений параметров. Его значение по умолчанию - java.lang.String . Его можно изменить на любой класс, доступный во время выполнения. Независимо от типа параметра отчета, механизм выполняет приведение в выражениях отчета, в которых используется токен $ P {}, поэтому ручное приведение не требуется.

Значения параметров отчета всегда упаковываются в объект java.util.Map, ключ которого является именем параметра. Параметры отчета можно использовать в строке запроса отчета, чтобы дополнительно настроить набор данных, извлеченный из базы данных. Они действуют как динамические фильтры в запросе, который предоставляет данные для отчета.

Встроенные параметры

Ниже приведены предварительно определенные параметры отчета, готовые для использования в выражениях:

S.NO Имя и описание параметра
1

REPORT_PARAMETERS_MAP

Содержит карту со всеми пользовательскими и встроенными параметрами.

2

REPORT_CONNECTION

Это указывает на предоставленный пользователем класс java.sql.Connection, используемый для источников данных JDBC.

3

REPORT_DATA_SOURCE

Это предоставленный пользователем экземпляр JRDataSource, представляющий либо один из встроенных типов источников данных, либо определенный пользователем.

4

REPORT_MAX_COUNT

Это значение java.lang.Integer , позволяющее пользователям ограничивать записи из источника данных.

5

REPORT_SCRIPTLET

Это указывает на net.sf.jasperreports.engine.JRAbstractScriptlet и содержит экземпляр скриптлета отчета, предоставленного пользователем.

6

REPORT_LOCALE

Это экземпляр java.util.Locale , содержащий требуемый языковой стандарт пакета ресурсов.

7

REPORT_RESOURCE_BUNDLE

Это указывает на объект java.util.ResourceBundle и содержит локализованные сообщения.

8

REPORT_TIME_ZONE

Это экземпляр java.util.TimeZone , используемый для форматирования даты.

9

REPORT_VIRTUALIZER

Это экземпляр объекта net.sf.jasperreports.engine.JRVirtualizer , который используется для виртуализации страницы (оптимизации потребления памяти).

10

REPORT_CLASS_LOADER

Это экземпляр java.lang.ClassLoader, который будет использоваться в процессе заполнения отчета для загрузки таких ресурсов, как изображения, шрифты и шаблоны вложенных отчетов.

11

IS_IGNORE_PAGINATION

Если задано значение java.lang.Boolean.TRUE, отчет будет создан на одной длинной странице, и разрыв страницы не произойдет.

пример

Давайте передадим ReportTitle и Author в отчет (сгенерированный JasperReportFill.java). Исправленный файлC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java выглядит следующим образом -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Содержимое файла POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java как показано ниже -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Содержимое файла C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Добавим параметры <ReportTitle> и <Author> в наш существующий шаблон отчета (Глава Report Designs ). Название и автор отчета будут отображаться в начале отчета. Обновленный шаблон отчета (jasper_report_template.jrxml) выглядит следующим образом. Сохраните его в каталог C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <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>

   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
           
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
				
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <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>

Генерация отчетов

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml выбирается из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport является целью по умолчанию) следующим образом:

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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 7 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 seconds

В результате вышеуказанной компиляции открывается окно JasperViewer, как показано на следующем экране -

Здесь мы видим, что заголовок отчета «Список контактов» и автор «Подготовлено Манишей» отображаются в начале отчета.

Источники данных представляют собой структурированный контейнер данных. При создании отчета движок JasperReports получает данные из источников данных. Данные могут быть получены из баз данных, файлов XML, массивов объектов и коллекций объектов. В главе « Заполнение отчетов» мы видели , что метод fillReportXXX () ожидает получить источник данных отчета, который необходимо заполнить, в видеnet.sf.jasperreports.engine.JRDataSource объект или java.sql.Connection (когда данные отчета находятся в реляционной базе данных).

Интерфейс JRDataSource имеет только два метода, которые следует реализовать:

  • public boolean next () выбрасывает JRException;

    • Во время заполнения отчета этот метод вызывается для объекта источника данных механизмом создания отчетов при итерации данных.

  • общедоступный объект getFieldValue (JRField jrField) выбрасывает JRException;

    • Этот метод предоставляет значение для каждого поля отчета в текущей записи источника данных.

Единственный способ получить данные из источника данных - использовать поля отчета. Существует несколько реализаций интерфейса JRDataSource по умолчанию, в зависимости от способа получения записей в источнике данных.

Реализации источников данных

В таблице ниже приведены источники данных и их классы реализации.

Источник данных Класс реализации
JDBC net.sf.jasperreports.engine.JRResultSetDataSource
JavaBean net.sf.jasperreports.engine.data.JRBeanCollectionDataSource, net.sf.jasperreports.engine.data.JRBeanArrayDataSource
На основе карты net.sf.jasperreports.engine.data.JRMapArrayDataSource, net.sf.jasperreports.engine.data.JRMapCollectionDataSource
TableModel net.sf.jasperreports.engine.data.JRTableModelDataSource
XML net.sf.jasperreports.engine.data.JRXmlDataSource
CSV net.sf.jasperreports.engine.data.JRCsvDataSource
XLS net.sf.jasperreports.engine.data.JRXlsDataSource
Пустой net.sf.jasperreports.engine.JREmptyDataSource

Источники данных JDBC

Класс JRResultSetDataSourceКрэпс в java.sql.ResultSet объект. Это наиболее часто используемые реализации источника данных, когда данные отчета извлекаются из реляционной базы данных. Если java.sql.Connection передается в двигатель вместо этого, он выполняет первый соответствующий запрос и сохраняет возвращенное java.sql.ResultSet объекта в экземпляре JRResultSetDataSource.

Источники данных JavaBean

Классы JRBeanArrayDataSource и JRBeanCollectionDataSourceпредставляют реализации, которые могут заключать в оболочку массивы и коллекции объектов JavaBean. Каждый объект внутри массива или коллекции будет рассматриваться как одна запись в этом типе источника данных. Сопоставление между определенным свойством JavaBean и соответствующим полем отчета выполняется с помощью соглашений об именах. Имя поля отчета должно быть таким же, как имя свойства JavaBean, как указано в спецификациях JavaBeans.

Во всех примерах этого руководства мы использовали JRBeanCollectionDataSource.

Источники данных на основе карт

Классы реализации JRMapArrayDataSource и JRMapCollectionDataSourceполезны, если родительское приложение уже хранит данные отчетов, доступные в памяти, как объекты java.util.Map . Каждый объект Map в обернутом массиве или коллекции считается виртуальной записью в источнике данных, и значение каждого поля отчета извлекается из карты с использованием поля отчета, названного в качестве ключа.

Источники данных TableModel

Во многих клиентских приложениях данные отображаются в табличном формате. Обычным требованием во многих приложениях является разрешение пользователю распечатать этот табличный формат в качестве отчета. Класс реализацииJRTableModelDataSourceделает задачу создания отчетов в табличном формате тривиальной для приложений Swing. Этот класс является оболочкой для объекта javax.swing.table.TableModel. К столбцам в обернутом объекте TableModel можно получить доступ либо по их именам, либо по их индексам, отсчитываемым от нуля.

Источники данных XML

Класс JRXmlDataSource- это реализация источника данных, основанная на модели DOM, которая использует выражения XPath для выбора данных из документа XML. Записи в источнике данных XML представлены элементами узла, выбранными с помощью выражения XPath. Значения полей извлекаются из каждой записи с использованием выражения XPath, предоставленного описанием поля (элемент <fieldDescription> в JRXML).

XPath - это язык, используемый для навигации по атрибутам и элементам XML-документа. Более подробную информацию о XPath можно найти наhttp://www.w3.org/TR/xpath.

Источники данных CSV

JRCsvDataSourceпредставляет реализацию для источников данных, которые получают свои данные из структурированных текстовых файлов; обычно CSV. Значения полей извлекаются с использованием их индекса столбца.

Источники данных XLS

JRXlsDataSourceпредставляет собой реализацию для источников данных, которые получают свои данные из документов Excel. Сопоставление поля отчета для этой реализации источника данных также основано на индексе столбца поля.

Пустые источники данных

Класс JREmptyDataSource, имитирует источник данных с заданным количеством виртуальных пустых записей внутри. Он используется инструментами пользовательского интерфейса, чтобы предложить базовые функции предварительного просмотра отчетов, или в специальных шаблонах отчетов, или для целей тестирования и отладки.

Источники данных с возможностью повторной перемотки

В net.sf.jasperreports.engine.JRRewindableDataSourceрасширяет базовый интерфейс JRDataSource . Он добавляет к интерфейсу только один метод, называемый moveFirst (). Этот метод предназначен для перемещения курсора к первому элементу в источнике данных.

Источники данных с возможностью повторной перемотки полезны при работе с вложенными отчетами, размещенными внутри полосы, которая не может быть разделена из-за параметра isSplitAllowed = "false", и на текущей странице недостаточно места для отображения вложенного отчета.

Все вышеперечисленные реализации источников данных можно перематывать, за исключением JRResultSetDataSource, поскольку он не поддерживает перемещение указателя записи назад. Это создает проблему только в том случае, если этот источник данных используется вручную для обертывания java.sql.ResultSet перед его передачей во вложенный отчет. Нет проблем, если запрос SQL находится в шаблоне подотчета, так как механизм выполнит его снова при перезапуске подотчета на следующей странице.

Поставщики источников данных

Библиотека JasperReports имеет интерфейс net.sf.jasperreports.engine.JRDataSourceProvider. Это помогает в создании и удалении объектов источника данных. При создании шаблона отчета с помощью инструментов с графическим интерфейсом требуется специальный инструмент для настройки источника данных отчета. JRDataSourceProvider - это стандартный способ подключения пользовательских источников данных к средству дизайна. Пользовательская реализация этого интерфейса должна реализовывать следующие методы, которые позволяют создавать и удалять объекты источника данных, а также методы для перечисления доступных полей отчета внутри источника данных, если это возможно:

public boolean supportsGetFieldsOperation();

public JRField[] getFields(JasperReport report)
   throws JRException, UnsupportedOperationException;

public JRDataSource create(JasperReport report) throws JRException;

public void dispose(JRDataSource dataSource) throws JRException;

Поля отчета - это элементы, которые представляют собой отображение данных между источником данных и шаблоном отчета. Поля можно комбинировать в выражениях отчета для получения желаемого результата. Шаблон отчета может содержать ноль или более элементов <field>. При объявлении полей отчета источник данных должен предоставлять данные, соответствующие всем полям, определенным в шаблоне отчета.

Декларация поля

Объявление поля выполняется, как показано ниже -

<field name = "FieldName" class = "java.lang.String"/>

Атрибут имени

Имя атрибута элемента <поля> является обязательным. Он ссылается на поле в выражениях отчета по имени.

Атрибут класса

Класс атрибут определяет имя класса для значений поля. Его значение по умолчанию - java.lang.String . Его можно изменить на любой класс, доступный во время выполнения. Независимо от типа поля отчета, механизм выполняет приведение в выражениях отчета, в которых используется токен $ F {}, что делает ненужным ручное приведение.

Описание поля

Элемент <fieldDesciption> - необязательный элемент. Это очень полезно при реализации настраиваемого источника данных. Например, мы можем сохранить ключ или некоторую информацию, с помощью которой мы можем получить значение поля из настраиваемого источника данных во время выполнения. Используя элемент <fieldDesciption> вместо имени поля, вы можете легко преодолеть ограничения соглашений об именах полей при извлечении значений полей из источника данных.

Ниже приведен фрагмент кода из нашего существующего файла JRXML ( проекты отчетов по главам ). Здесь мы можем увидеть использованиеname, class, и fieldDescription элементы.

<field name = "country" class = "java.lang.String">
   <fieldDescription><![CDATA[country]]></fieldDescription>
</field>

<field name = "name" class = "java.lang.String">
   <fieldDescription><![CDATA[name]]></fieldDescription>
</field>

Сортировать поля

В тех случаях, когда требуется сортировка данных, а реализация источника данных не поддерживает ее (например, источник данных CSV), JasperReports поддерживает сортировку источников данных на основе полей в памяти. Сортировку можно выполнить с помощью одного или нескольких элементов <sortField> в шаблоне отчета.

Если указано хотя бы одно поле сортировки, в процессе заполнения отчета источник данных передается в экземпляр JRSortableDataSource . Это, в свою очередь, извлекает все записи из источника данных, выполняет сортировку в памяти в соответствии с указанными полями и заменяет исходный источник данных.

Имя поля сортировки должно совпадать с именем поля отчета. Поля, используемые для сортировки, должны иметь типы, реализующие java.util.Comparable. Сортировка в естественном порядке выполняется для всех полей, кроме полей типа java.lang.String (для типа String используется сопоставитель, соответствующий языку заполнения отчета). Если указано несколько полей сортировки, сортировка будет выполняться с использованием полей в качестве ключей сортировки в том порядке, в котором они появляются в шаблоне отчета. В следующем примере демонстрируется функция сортировки.

Пример отсортированного отчета

Добавим <sortField> элемент нашего существующего шаблона отчета ( проекты отчетов по главам ). Отсортируем поле страна в порядке убывания. Обновленный шаблон отчета (jasper_report_template.jrxml) выглядит следующим образом. Сохраните его в каталог C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595" pageHeight = "842" 
   columnWidth = "515" leftMargin = "40" rightMargin = "40" 
   topMargin = "50" bottomMargin = "50">
	
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <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>
  
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
            
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <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>

Java-коды для заполнения отчетов остались без изменений. Содержимое файлаC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName =
      "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Содержимое файла POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java приведены ниже -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Содержимое файла C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Генерация отчета

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport является целью по умолчанию) следующим образом:

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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 7 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 seconds

В результате вышеуказанной компиляции открывается окно JasperViewer, как показано на экране, приведенном ниже -

Здесь мы видим, что названия стран расположены в алфавитном порядке по убыванию.

Выражения отчета - это мощные возможности JasperReports, которые позволяют отображать рассчитанные данные в отчете. Вычисляемые данные - это данные, которые не являются статическими данными и специально не передаются в качестве параметра отчета или поля источника данных. Выражения отчета создаются путем объединения параметров отчета, полей и статических данных. По умолчанию для написания выражений отчетов используется язык Java. Другие языки сценариев для выражений отчетов, такие как язык сценариев Groovy, JavaScript или сценарий BeanShell, поддерживаются компиляторами JasperReports.

В этой главе вы узнаете, как работают выражения отчета, если предполагается, что они были написаны только на языке Java. В шаблоне отчета JRXML есть несколько элементов, которые определяют выражения как:

  • <variableExpression>
  • <initialValueExpression>
  • <groupExpression>
  • <printWhenExpression>
  • <imageExpression>
  • <textFieldExpression>

Объявление выражения

По сути, все выражения отчета являются выражениями Java, которые могут ссылаться на поля отчета, переменные отчета и параметры отчета.

Ссылка на поле в выражении

Чтобы использовать ссылку на поле отчета в выражении, имя поля должно быть помещено между $F{и} последовательности символов, как показано ниже -

<textfieldexpression>
   $F{Name}
</textfieldexpression>

Ниже приведен фрагмент кода из нашего существующего файла JRXML (глава Report Designs) -

<textFieldExpression class = "java.lang.String">
   <![CDATA[$F{country}]]>
</textFieldExpression>

Ссылка на переменную в выражении

Чтобы ссылаться на переменную в выражении, мы должны поместить имя переменной между $V{и} как показано в примере, приведенном ниже -

<textfieldexpression>
   "Total height : " + $V{SumOfHeight} + " ft."
</textfieldexpression>

Ссылка на параметр в выражении

Чтобы ссылаться на параметр в выражении, имя параметра следует поместить между $P{и} как показано в примере, приведенном ниже -

<textfieldexpression>
   "ReportTitle : " + $P{Title}
</textfieldexpression>

Ниже приведен фрагмент кода из нашего существующего файла JRXML, который демонстрирует ссылку на параметр в выражении. (JRXML из главы Проекты отчетов ) -

<textField isBlankWhenNull = "true" bookmarkLevel = "1">
   <reportElement x = "0" y = "10" width = "515" height = "30"/>
   
   <textElement textAlignment = "Center">
      <font size = "22"/>
   </textElement>
   
   <textFieldExpression class = "java.lang.String">
      <![CDATA[$P{ReportTitle}]]>
   </textFieldExpression>
   
   <anchorNameExpression>
      <![CDATA["Title"]]>
   </anchorNameExpression>
</textField>

<textField isBlankWhenNull = "true">
   <reportElement  x = "0" y = "40" width = "515" height = "20"/>
   
   <textElement textAlignment = "Center">
      <font size = "10"/>
   </textElement>
   
   <textFieldExpression class = "java.lang.String">
      <![CDATA[$P{Author}]]>
   </textFieldExpression>
</textField>

Как вы видели выше, ссылки на параметры, поля и переменные на самом деле являются реальными объектами Java. Зная их класс из объявления параметра, поля или переменной, сделанного в шаблоне отчета, мы можем даже вызывать методы для этих ссылок на объекты в выражениях.

В следующем примере показано - как извлечь и отобразить первую букву из поля отчета java.lang.String «Имя» -

<textFieldExpression>
   $F{Name}.substring(0, 1)
</textFieldExpression>

Ссылка на пакет ресурсов в выражении

Чтобы ссылаться на ресурс в выражении, ключ должен быть помещен между$R{и} как показано в примере, приведенном ниже -

<textfieldexpression>
   $R{report.title}
</textfieldexpression>

В зависимости от языкового стандарта среды выполнения и ключа report.title загружается комплект ресурсов, связанный с шаблоном отчета. Следовательно, заголовок отчета отображается путем извлечения значения String из пакета ресурсов. Подробнее об интернационализации можно найти в главе Интернационализация .

Калькулятор

Калькулятор - это объект в JasperReports, который оценивает выражения и увеличивает переменные или наборы данных во время заполнения отчета. В процессе компиляции информация создается и сохраняется компилятором в отчете о компиляции. Эта информация используется во время заполнения отчета для создания экземпляра класса net.sf.jasperreports.engine.fill.JRCalculator.

Исходный файл Java создается и компилируется компиляторами отчетов на основе Java "на лету". Этот сгенерированный класс является подклассом JRCalculator, и байт-код, созданный при его компиляции, сохраняется внутри объекта JasperReport. Этот байт-код загружается во время заполнения отчета, а результирующий класс создается для получения объекта калькулятора, необходимого для оценки выражения.

Условные выражения

JasperReports не поддерживает операторы if-else при определении выражений переменных. Вместо этого вы можете использовать тернарные операторы{cond} ? {statement 1} : {statement 2}. Этот оператор может быть вложен в выражение Java, чтобы получить желаемый результат на основе нескольких условий.

Пример условного выражения в отчете

Давайте изменим существующий шаблон отчета ( Дизайн отчетов по главам ) и добавим условное выражение для поля страны. Обновленный шаблон отчета (jasper_report_template.jrxml) выглядит следующим образом. Сохраните его в каталог C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595" pageHeight = "842" 
   columnWidth = "515" leftMargin = "40" rightMargin = "40" 
   topMargin = "50" bottomMargin = "50">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <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>
   
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]> </textFieldExpression> <anchorNameExpression> <![CDATA["Title"]]> </anchorNameExpression> </textField> <textField isBlankWhenNull = "true"> <reportElement x = "0" y = "40" width = "515" height = "20"/> <textElement textAlignment = "Center"> <font size = "10"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{Author}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </title>
   
   <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}.isEmpty() ? "NO COUNTRY" : $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>

Java-коды для заполнения отчетов следующие. Содержимое файлаC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java как -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName =
      "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Содержимое файла POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java как -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Мы добавим новую запись с пустым полем страны в наш список Java bean-компонентов. Содержимое файлаC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java как -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California")); dataBeanList.add(produce("Tanmay", ""));
      
      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Генерация отчетов

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Ниже приводится содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test).

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class = com.tutorialspoint.JasperReportFill (viewFullReport является целью по умолчанию) как -

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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 3 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
    [java] log4j:WARN No appenders could be found for logger
    (net.sf.jasperreports.extensions.ExtensionsEnvironment).
    [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 5 minutes 5 seconds

C:\tools\jasperreports-5.0.1\test>

В результате вышеуказанной компиляции открывается окно JasperViewer, как показано на экране, приведенном ниже -

Здесь мы видим, что для последней записи мы не передали никаких данных для поля country, печатается «NO COUNTRY».

Переменные отчета - это специальные объекты, созданные поверх выражения отчета.

Переменные отчета упрощают следующие задачи -

  • Выражения отчета, которые часто используются в шаблоне отчета. Эти выражения могут быть объявлены только один раз с использованием переменных отчета.

  • Переменные отчета могут выполнять различные вычисления на основе соответствующих значений выражений, таких как количество, сумма, среднее, минимальное, максимальное, дисперсия и т. Д.

Если переменные определены в дизайне отчета, то на них могут ссылаться новые переменные в выражениях. Следовательно, важен порядок, в котором переменные объявляются в дизайне отчета.

Объявление переменной

Объявление переменной выглядит следующим образом -

<variable name = "CityNumber" class = "java.lang.Integer" incrementType = "Group"
   incrementGroup = "CityGroup" calculation = "Count">
   <variableExpression>
      <![CDATA[Boolean.TRUE]]>
   </variableExpression>
</variable>

Как видно выше, элемент <variable> содержит ряд атрибутов. Эти атрибуты кратко описаны ниже -

Атрибут имени

Подобно параметрам и полям , атрибут name элемента </variable> является обязательным. Это позволяет ссылаться на переменную по ее объявленному имени в выражениях отчета.

Атрибут класса

Класса атрибут также является обязательной , который определяет имя класса для значений переменных. Его значение по умолчанию - java.lang.String . Его можно изменить на любой класс, доступный в пути к классам, как во время компиляции отчета, так и во время заполнения отчета. Движок заботится о приведении типов в выражениях отчета, в которых используется токен $ V {}, поэтому ручное приведение типов не требуется.

Расчет

Этот атрибут определяет - какой расчет производить с переменной при заполнении отчета. В следующих подразделах описаны все возможные значения атрибута вычисления элемента <variable>.

  • Среднее - значение переменной - это среднее значение каждого ненулевого значения выражения переменной. Действительно только для числовых переменных.

  • Count - Значение переменной является счетчиком экземпляров ненулевых выражения переменной.

  • Первый - значение переменной - это значение первого экземпляра выражения переменной. Последующие значения игнорируются.

  • Наивысшее - значение переменной - это максимальное значение для выражения переменной.

  • Наименьшее - значение переменной - это наименьшее значение для выражения переменной в отчете.

  • Ничего - для переменной вычисления не производятся.

  • StandardDeviation - значение переменной представляет собой стандартное отклонение всех ненулевых значений, соответствующих выражению отчета. Действительно только для числовых переменных.

  • Сумма - значение переменной представляет собой сумму всех ненулевых значений, возвращаемых выражением отчета.

  • Система - значение переменной представляет собой настраиваемое вычисление (вычисление значения для этой переменной самостоятельно с использованием функций скриптлетов JasperReports).

  • Дисперсия - значение переменной - это дисперсия всех ненулевых значений, возвращаемых при оценке выражения переменной отчета.

Инкрементатор FactoryClass

Этот атрибут определяет класс, используемый для вычисления значения переменной при заполнении текущей записи в отчете. Значение по умолчанию - любой класс, реализующийnet.sf.jasperreports.engine.fill.JRIncrementerFactory. Класс фабрики будет использоваться механизмом для создания экземпляров объектов инкрементатора во время выполнения в зависимости от атрибута вычисления, установленного для переменной.

IncrementType

Это определяет, когда следует пересчитывать значение переменной. Этот атрибут использует значения, как показано ниже -

  • Столбец - значение переменной пересчитывается в конце каждого столбца.

  • Группа - значение переменной пересчитывается при изменении группы, указанной в incrementGroup.

  • Нет - значение переменной пересчитывается для каждой записи.

  • Страница - значение переменной пересчитывается в конце каждой страницы.

  • Отчет - значение переменной пересчитывается один раз, в конце отчета.

IncrementGroup

Это определяет имя группы, в которой значение переменной пересчитывается, когда incrementType имеет значение Group . Это принимает имя любой группы, объявленной в шаблоне отчета JRXML.

ResetType

Это определяет, когда значение переменной сбрасывается. Этот атрибут использует значения, как показано ниже -

  • Столбец - значение переменной сбрасывается в начале каждого столбца.

  • Группа - значение переменной сбрасывается при изменении группы, указанной в incrementGroup.

  • Нет - значение переменной никогда не сбрасывается.

  • Страница - значение переменной сбрасывается в начале каждой страницы.

  • Отчет - значение переменной сбрасывается только один раз, в начале отчета.

ResetGroup

Это определяет имя группы, в которой значение переменной сбрасывается, когда resetType имеет значение Group . Значения этого атрибута будут именем любой группы, объявленной в шаблоне отчета JRXML.

Встроенные переменные отчета

Есть несколько встроенных системных переменных, готовых к использованию в выражениях, а именно:

S.NO Имя и описание переменной
1

PAGE_NUMBER

Значение этой переменной - номер ее текущей страницы. Он может быть использован для отображения как номер текущей страницы и общее количество страниц с помощью специальной функции элементов поля JasperReports текста, в evaluationTime атрибута.

2

COLUMN_NUMBER

Эта переменная содержит текущий номер столбца.

3

REPORT_COUNT

Эта переменная отчета содержит общее количество обработанных записей.

4

PAGE_COUNT

Эта переменная содержит количество записей, которые были обработаны при создании текущей страницы.

5

COLUMN_COUNT

Эта переменная содержит количество записей, которые были обработаны при создании текущего столбца.

6

GroupName_COUNT

Имя этой переменной происходит от имени группы, которой она соответствует, с суффиксом _COUNT. Эта переменная содержит количество записей в текущей группе.

пример

Добавим переменную (countNumber) в наш существующий шаблон отчета ( Дизайн отчета по главам ). Мы будем добавлять счетчик к каждой записи. Обновленный шаблон отчета (jasper_report_template.jrxml) выглядит следующим образом. Сохраните его в каталог C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <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>
   
   <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
      <variableExpression>
         <![CDATA[Boolean.TRUE]]>
      </variableExpression>
   </variable>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
			
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <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["  " + String.valueOf($V{countNumber}) +"."+$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

Java-коды для заполнения отчетов остались без изменений. Содержимое файлаC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName =
      "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Содержимое файла POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java приведены ниже -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Содержимое файла C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Генерация отчетов

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml выбирается из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport является целью по умолчанию) как -

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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 7 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 seconds

В результате вышеуказанной компиляции открывается окно JasperViewer, как на экране ниже -

Здесь мы видим, что счетчик имеет префикс для каждой записи.

Мы обсудили структуру простого шаблона отчета в главе « Начало работы» . Аналогичным образом JasperReports разбивает шаблон отчета на несколько разделов. Разделы - это части отчета, которые имеют указанную высоту и могут содержать объекты отчета, такие как строки, прямоугольники, изображения или текстовые поля.

Механизм отчетов выполняет итерацию по виртуальным записям предоставленного источника данных отчета во время заполнения отчета. В зависимости от определенного поведения каждого раздела механизм затем при необходимости отображает каждый раздел отчета. Например, раздел сведений отображается для каждой записи в источнике данных. Когда происходит разрыв страницы, разделы верхнего и нижнего колонтитула отображаются по мере необходимости.

В JasperReports разделы терминологии и отчета также называются report bands. Разделы состоят из одной или нескольких полос. Эти разделы повторно заполняются во время создания отчета и подготовки окончательного документа.

Основные разделы

Шаблон отчета в JasperReports имеет следующие основные разделы:

<title></title>

<pageheader></pageheader>

<columnheader></columnheader>

<groupheader></groupheader>

<detail></detail>

<groupfooter></groupfooter>

<columnfooter></columnfooter>

<pagefooter></pagefooter>

<lastpagefooter></lastpagefooter>

<summary></summary>

<nodata></nodata>

<background></background>

В следующей таблице обобщен каждый из разделов -

S.NO Раздел и описание
1

Title

Этот раздел появляется только один раз в начале отчета.

2

Page Header

Этот раздел появляется в начале каждой страницы в созданном документе.

3

Column Header

Этот раздел появляется в начале каждого столбца в созданном документе. Если в отчете определен только один столбец, то разделы заголовка и нижнего колонтитула игнорируются.

4

Group Header

Этот раздел вводится группой отчетов (глава Группы ). Каждый раз, когда выражение группировки меняет свое значение, раздел заголовка группы печатается над разделом сведений. В случае, если определено более одной группы, заголовок группы печатается в порядке определения группы.

5

Detail

Этот раздел повторяется для каждой строки данных, предоставленных источником данных отчета. Детальный раздел может состоять из нескольких полос.

6

Group Footer

Этот раздел вводится группой отчетов (глава Группы ). Раздел нижнего колонтитула группы печатается под разделом сведений до изменения значения выражения группировки. Нижний колонтитул группы всегда печатается для последней строки данных в источнике данных. В случае, если определено более одной группы, нижний колонтитул группы печатается в порядке, обратном порядку определения группы.

7

Column Footer

Этот раздел отображается внизу каждого столбца. Если количество столбцов в отчете равно 1, то разделы заголовка и нижнего колонтитула игнорируются.

8

Page Footer

Этот раздел отображается внизу каждой страницы.

9

Last Page Footer

Этот раздел заменяет обычный нижний колонтитул последней страницы отчета. Если также присутствует сводный раздел, то это может быть не самая последняя страница документа. Этот раздел иногда бывает полезен, когда сводная информация должна отображаться внизу последней страницы.

10

Summary

Этот раздел появляется только один раз в конце отчета.

11

No Data

Этот раздел печатается, если для свойства отчета Когда нет данных печати установлено значение Нет раздела данных . Если в шаблоне отчета определен раздел <noData> и если источник данных пуст, то при заполнении будет учитываться только раздел <noData>, и его содержимое будет выводить отчет.

12

Background

Раздел фона отображается на каждой странице и не может перейти на следующую страницу. Элементы, размещенные в этом разделе, оцениваются во время инициализации страницы и отображаются в фоновом режиме. Все остальные объекты страницы отображаются поверх фоновых объектов. Этот раздел полезен для создания водяных знаков на странице.

Раздел, элементы и взаимосвязь атрибутов

На следующей диаграмме показаны взаимосвязи элементов и атрибутов в разделе отчета.

Элементы раздела

Все вышеперечисленные разделы отчета не являются обязательными. Но в любом шаблоне отчета будет хотя бы один такой раздел. Каждый из этих разделов содержит один <band> как его единственный подэлемент. А <band> может содержать ноль или более следующих подэлементов -

<строка>, <прямоугольник>, <эллипс>, <изображение>, <статический текст>, <текстовое поле>, <суб-отчет> или <группа элементов>

Каждый из этих элементов должен содержать единственный <reportElement> в качестве первого элемента (кроме elementGroup). А <reportElement> определяет, как данные размещаются для этого конкретного элемента. В отличие от переменных и параметров, элементы отчета не обязательно должны иметь имя, потому что обычно вам не нужно получать какой-либо отдельный элемент внутри шаблона отчета.

В таблице ниже приведены атрибуты <reportElement> -

Атрибут Описание Действительные значения
Икс Задает координату x элемента полосы. Целочисленное значение, указывающее координату x элемента в пикселях. Этот атрибут обязателен.
y Задает координату y элемента полосы. Целочисленное значение, указывающее координату y элемента в пикселях. Этот атрибут обязателен.
ширина Задает ширину элемента полосы. Целочисленное значение, указывающее ширину элемента в пикселях. Этот атрибут обязателен.
высота Задает высоту элемента полосы. Целочисленное значение, указывающее высоту элемента в пикселях. Этот атрибут обязателен.
ключ Уникальный идентификатор элемента бэнда. Уникальное строковое значение.
stretchType Определяет, как растягивается элемент при растяжении содержащей его полосы

NoStretch (default) - Элемент не растягивается.

RelativeToTallestObject - Элемент будет растягиваться, чтобы вместить самый высокий объект в своей группе.

RelativeToBand - Элемент растянется по высоте ремешка.

positionType Определяет положение элемента при растяжении полосы.

Float - Элемент будет перемещаться в зависимости от размера окружающих элементов.

FixRelativeToTop (default) - Элемент будет сохранять фиксированное положение относительно верха ленты.

FixRelativeToBottom - Элемент будет сохранять фиксированное положение относительно низа полосы.

isPrintRepeatedValues Указывает, печатаются ли повторяющиеся значения.

true (default) - Будут напечатаны повторяющиеся значения.

false - Повторяющиеся значения не печатаются.

Режим Задает фоновый режим элемента Непрозрачный, прозрачный
isRemoveLineWhenBlank Определяет, следует ли удалить элемент, когда он пуст и в том же горизонтальном пространстве нет других элементов. правда, ложь
isPrintInFirstWholeBand Указывает, нужно ли печатать элемент целиком, то есть полосой, которая не разделена между страницами или столбцами отчета. правда, ложь
isPrintWhenDetailOverFlows Определяет, будет ли элемент печататься, когда полоса переполняется на новую страницу или столбец. правда, ложь
printWhenGroupChanges Указывает, что элемент будет напечатан при изменении указанной группы. Строковое значение.
передний цвет Задает цвет переднего плана элемента. Либо шестнадцатеричное значение RGB, которому предшествует символ #, либо одно из следующих предварительно определенных значений: черный, синий, голубой, темно-серый, серый, зеленый, светло-серый, пурпурный, оранжевый, розовый, красный, желтый, белый.
цвет фона Задает цвет фона элемента. То же, что и допустимые значения для переднего цвета

Атрибуты раздела

Ниже приведены атрибуты раздела отчета -

Высота

Высота раздела определяет высоту в пикселях для этого конкретного раздела и очень важна для общего дизайна отчета.

Печать, когда выражение

Логическое выражение, определяющее, следует ли печатать раздел.

Разрешено разделение

Флаг, указывающий, можно ли разделить раздел, если он не помещается на текущей странице. Если true, раздел будет перенесен на следующую страницу. Обратите внимание, что если раздел не помещается на следующей странице, то раздел будет разделен независимо от значения флага. splitType может принимать следующие значения -

  • splitType = "Stretch:" Разделяет растянутый контент. Если раздел растягивается на текущей странице (если доступное пространство меньше заявленной высоты), область, которая добавляется к исходной высоте, может быть разделена на следующую страницу.

  • splitType = "Prevent:" Предотвратить разделение с первой попытки. Если раздел не помещается на следующей странице, разделение происходит нормально, поскольку предотвращение разделения полосы эффективно только при первой попытке разделения.

  • splitType = "Immediate:" Немедленное разделение. Бэнду разрешено разделиться где угодно, кроме самого верхнего элемента.

пример

Для демонстрации каждого раздела напишем шаблон отчета (jasper_report_template.jrxml). Сохраните этот файл вC:\tools\jasperreports-5.0.1\testкаталог. В этом файле мы будем отображать текст в каждом из разделов (мы обсуждали выше). Содержимое файла приведено ниже -

<?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>

Код Java для заполнения и генерации отчета приведен ниже. Сохраним этот файлJasperReportFill.java в каталог 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();
      }

   }
}

Здесь мы используем экземпляр JREmptyDataSource при заполнении отчетов для имитации источника данных с одной записью в нем, но со всеми полями в этой единственной записи равными нулю.

Генерация отчетов

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport является целью по умолчанию) следующим образом:

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

В результате вышеуказанной компиляции открывается окно JasperViewer, как на экране ниже -

Здесь мы видим, что в каждом из разделов печатается текст. Следует отметить, что поскольку JRXML содержит элемент <lastPageFooter>, он будет отображаться на последней странице отчета вместо отображаемого элемента <pageFooter>. Элементы <columnHeader> и <columnFooter> будут отображаться в отчете, только если в нем более одного столбца.

Группы в JasperReports помогают логично организовать данные в отчете. Группа отчетов представляет собой последовательность последовательных записей в источнике данных, которые имеют нечто общее, например значение определенных полей отчета. Группа отчетов определяется элементом <group>. В отчете может быть любое количество групп. После объявления группы могут упоминаться в отчете.

Группа отчетов состоит из трех элементов -

  • Выражение группы - это указывает данные, которые должны измениться, чтобы начать новую группу данных.

  • Раздел заголовка группы - Помогает разместить метку в начале сгруппированных данных.

  • Раздел нижнего колонтитула группы - помогает разместить метку в конце сгруппированных данных.

Если во время итерации по источнику данных во время заполнения отчета изменяется значение выражения группы, происходит разрыв группы и соответствующие разделы <groupFooter> и <groupHeader> вставляются в итоговый документ.

Механизм группы отчетов не выполняет никакой сортировки данных, предоставленных источником данных. Группировка данных работает должным образом, только если записи в источнике данных уже упорядочены в соответствии с выражениями группы, используемыми в отчете.

Атрибуты группы

Элемент <group> содержит атрибуты, которые позволяют нам контролировать расположение сгруппированных данных. Атрибуты приведены в таблице ниже -

S.NO Атрибут и описание
1

name

Это обязательно. Он ссылается на группу в выражениях отчета по имени. Он следует тем же соглашениям об именах, которые мы упоминали для параметров отчета, полей и переменных отчета. Его можно использовать в других атрибутах JRXML, если вы хотите указать определенную группу отчетов.

2

isStartNewColumn

Если установлено значение true , каждая группа данных будет начинаться с нового столбца. Значение по умолчанию - false .

3

isStartNewPage

Если установлено значение true , каждая группа данных будет начинаться с новой страницы. Значение по умолчанию - false .

4

isResetPageNumber

Если установлено значение true , номер страницы отчета будет сбрасываться каждый раз при запуске новой группы. Значение по умолчанию - false.

5

isReprintHeaderOnEachPage

Если установлено значение true , заголовок группы будет повторно печататься на каждой странице. Значение по умолчанию - false .
6

minHeightToStartNewPage

Определяет минимальный размер вертикального пространства, необходимого внизу столбца для размещения заголовка группы в текущем столбце. Сумма указывается в отчетных единицах.

7

footerPosition

Отображает положение нижнего колонтитула группы на странице, а также его поведение по отношению к разделам отчета, которые следуют за ним. Его значение может быть: Normal , StackAtBottom , ForceAtBottom и CollateAtBottom . Значение по умолчанию - Нормальное .

8

keepTogether

Если установлено значение true , предотвращает разделение группы при первой попытке разрыва.

пример

Добавим группу (CountryGroup) в существующий шаблон отчета ( Дизайн отчетов по главам ). Подсчитывается появление каждой страны, и это количество отображается в нижнем колонтитуле группы. В заголовке группы перед числом каждой записи ставится префикс. Обновленный шаблон отчета (jasper_report_template.jrxml) выглядит следующим образом. Сохраните его в каталог C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>

   <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>
   
   <sortField name = "country" order = "Descending"/>
   <sortField name = "name"/>
   
   <variable name = "CountryNumber" class = "java.lang.Integer"
      incrementType = "Group" incrementGroup = "CountryGroup"
      calculation = "Count">
      <variableExpression><![CDATA[Boolean.TRUE]]></variableExpression>
   </variable>
   
   <group name = "CountryGroup" minHeightToStartNewPage = "60">
      <groupExpression><![CDATA[$F{country}]]></groupExpression> <groupHeader> <band height = "20"> <textField evaluationTime = "Group" evaluationGroup = "CountryGroup" bookmarkLevel = "1"> <reportElement mode = "Opaque" x = "0" y = "5" width = "515" height = "15" backcolor = "#C0C0C0"/> <box leftPadding = "10"> <bottomPen lineWidth = "1.0"/> </box> <textElement/> <textFieldExpression class = "java.lang.String"> <![CDATA[" " + String.valueOf($V{CountryNumber}) + ". "
                  + String.valueOf($F{country})]]> </textFieldExpression> <anchorNameExpression> <![CDATA[String.valueOf($F{country})]]>
               </anchorNameExpression>
            </textField>
         
         </band>
      </groupHeader>
      
      <groupFooter>
         <band height = "20">
            
            <staticText>
               <reportElement x = "400" y = "1" width = "60" height = "15"/>
               <textElement textAlignment = "Right"/>
               <text><![CDATA[Count :]]></text>
            </staticText>
            
            <textField>
               <reportElement x = "460" y = "1" width = "30" height = "15"/>
               <textElement textAlignment = "Right"/>
               
               <textFieldExpression class = "java.lang.Integer">
                  <![CDATA[$V{CountryGroup_COUNT}]]> </textFieldExpression> </textField> </band> </groupFooter> </group> <title> <band height = "70"> <line> <reportElement x = "0" y = "0" width = "515" height = "1"/> </line> <textField isBlankWhenNull = "true" bookmarkLevel = "1"> <reportElement x = "0" y = "10" width = "515" height = "30"/> <textElement textAlignment = "Center"> <font size = "22"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
            
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <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>

Java-коды для заполнения отчетов остались без изменений. Содержимое файлаC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName =
      "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Содержимое файла POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java как показано ниже -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Содержимое файла C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Генерация отчетов

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы Настройка среды и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport является целью по умолчанию) как -

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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 7 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 seconds

В результате вышеуказанной компиляции открывается окно JasperViewer, как на экране ниже -

Здесь мы видим, что каждая страна сгруппирована, и количество вхождений каждой страны отображается в нижнем колонтитуле каждой группы.

Отчет содержит текстовые элементы, и каждый из них может иметь собственные настройки шрифта. Эти настройки можно указать с помощью <font> доступен в теге <textElement>. В отчете можно определить несколько шрифтов. После определения они могут использоваться как настройки по умолчанию или как базовые настройки шрифта для других определений шрифтов во всем отчете.

Шрифты отчетов

Шрифт отчета - это набор настроек шрифта, объявленных на уровне отчета. Шрифт отчета можно повторно использовать во всем шаблоне отчета при настройке свойств шрифта текстовых элементов.

Шрифты отчетов устарели. Не используйте элементы <reportFont />, объявленные в самом документе. Вместо этого используйте элемент <style />.

Атрибуты шрифта

В таблице ниже приведены основные атрибуты <font> элемент -

S.NO Атрибут и описание
1

fontName

Имя шрифта, которое может быть именем физического шрифта, логическим шрифтом или именем семейства шрифтов из зарегистрированных расширений шрифтов JasperReports.

2

size

Размер шрифта в пунктах. По умолчанию 10.

3

isBold

Флаг, указывающий, требуется ли полужирный шрифт. По умолчанию - false.

4

isItalic

Флаг, указывающий, требуется ли курсивный шрифт. По умолчанию - false.

5

isUnderline

Флаг, указывающий, требуется ли оформление подчеркнутого текста. По умолчанию - false.

6

isStrikeThrough

Флаг, указывающий, требуется ли оформление зачеркнутого текста. По умолчанию - false.

7

pdfFontName

Имя эквивалентного шрифта PDF, необходимого библиотеке iText при экспорте документов в формат PDF.

8

pdfEncoding

Эквивалентная кодировка символов PDF, также требуемая библиотекой iText.

9

isPdfEmbedded

Флаг, указывающий, следует ли встраивать шрифт в сам документ. По умолчанию - false. Если установлено значение true, помогает просматривать документ PDF без каких-либо проблем.

Типы шрифтов

В JasperReports шрифты можно разделить на -

  • Logical Fonts- Пять типов шрифтов, которые распознаются платформой Java начиная с версии 1.0, называются логическими шрифтами. Это -Serif, SansSerif, Monospaced, Dialog, and DialogInput. Эти логические шрифты не являются фактическими библиотеками шрифтов, которые устанавливаются где-либо в системе. Это просто имена типов шрифтов, распознаваемые средой выполнения Java. Они должны быть сопоставлены с некоторым физическим шрифтом, установленным в системе.

  • Physical Fonts- Эти шрифты представляют собой фактические библиотеки шрифтов, состоящие, например, из шрифтов TrueType или PostScript Type 1. Физические шрифты могут быть Arial, Time, Helvetica, Courier или любым другим шрифтом, включая международные шрифты.

  • Font Extensions- Библиотека JasperReports может использовать шрифты, зарегистрированные "на лету" во время выполнения, благодаря встроенной поддержке расширений шрифтов. Список семейств шрифтов можно сделать доступным для JasperReports с помощью расширения шрифта. Они сделаны из одинаковых шрифтов и поддерживают определенные языковые стандарты.

Как описано в таблице выше, нам необходимо указать в атрибуте fontName имя физического шрифта, имя логического шрифта или имя семейства шрифтов из зарегистрированных расширений шрифтов JasperReports.

Название шрифта PDF

Библиотека JasperReports использует библиотеку iText при экспорте отчетов в PDF (Portable Document Format). PDF-файлы можно просматривать на разных платформах, и они всегда будут выглядеть одинаково. Частично это связано с тем, что в этом формате есть особый способ работы со шрифтами. Атрибут fontName не используется при экспорте в PDF. Атрибут pdfFontName существует там, где нам нужно указать настройки шрифта.

Библиотека iText знает, как работать со встроенными шрифтами и файлами TTF, и распознает следующие имена встроенных шрифтов:

  • Courier
  • Courier-Bold
  • Courier-BoldOblique
  • Courier-Oblique
  • Helvetica
  • Helvetica-Bold
  • Helvetica-BoldOblique
  • Helvetica-Oblique
  • Symbol
  • Times-Roman
  • Times-Bold
  • Times-BoldItalic
  • Times-Italic
  • ZapfDingbats

В соответствии с предварительным условием библиотеки iText для работы со шрифтами нам нужно указать одно из следующих в качестве имени шрифта:

  • Имя встроенного шрифта из приведенного выше списка.

  • Имя файла TTF (True Type Font), который он может найти на диске.

  • Настоящее имя шрифта при условии, что файл TTF, содержащий шрифт, был ранее зарегистрирован в iText или что псевдоним был определен при регистрации шрифта.

На основе вышеуказанных предварительных условий атрибут pdfFontName может содержать одно из следующих значений:

  • Имя встроенного шрифта PDF из приведенного выше списка.

  • Имя файла TTF, который может находиться на диске во время выполнения при экспорте в PDF.

  • Настоящее имя зарегистрированного шрифта.

  • Суффикс ключа (часть после net.sf.jasperreports.export.pdf.font ) для шрифта, зарегистрированного в iText как файл шрифта.

Шрифты по умолчанию и наследование

Каждый текстовый элемент наследует атрибуты шрифта и стиля от своего родительского элемента, который, в свою очередь, наследует эти атрибуты от своего родительского элемента. Если для элементов не определены стили и / или шрифты, будет применен стиль по умолчанию (и / или шрифт - но теперь он устарел), объявленный в корневом элементе <jasperReport />.

Определение стилей или шрифтов по умолчанию в JasperReports не является обязательным. Если для данного элемента не определен шрифт, механизм ищет либо унаследованные атрибуты шрифта, либо, если на этом пути не обнаружены атрибуты, ищет свойство net.sf.jasperreports.default.font.name в / src / default.jasperreports.properties . Его значение определяет имя семейства шрифтов, которое будет использоваться, когда свойства шрифта не определены явно для текстового элемента или унаследованы от его родительского элемента.

Основные свойства шрифта по умолчанию и их значения, определенные в файле /src/default.jasperreports.properties, приведены в таблице ниже -

Свойство Описание
net.sf.jasperreports.default.font.name = SansSerif Название шрифта по умолчанию.
net.sf.jasperreports.default.font.size = 10 Размер шрифта по умолчанию.
net.sf.jasperreports.default.pdf.font.name = Helvetica Шрифт PDF по умолчанию.
net.sf.jasperreports.default.pdf.encoding = Cp1252 Кодировка символов PDF по умолчанию.
net.sf.jasperreports.default.pdf.embedded = false По умолчанию шрифты PDF не встроены.

пример

Чтобы продемонстрировать использование шрифтов и атрибутов шрифтов для получения определенного внешнего вида текста, давайте напишем новый шаблон отчета (jasper_report_template.jrxml). Содержимое JRXML показано ниже. Сохраните его в каталоге C: \ tools \ jasperreports-5.0.1 \ test. Здесь мы будем отображать текст в заголовке отчета в различных форматах шрифта.

<?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 = "595" pageHeight = "842"
   columnWidth = "555" leftMargin = "20" rightMargin = "20" topMargin = "30"
   bottomMargin = "30">

   <title>
      <band height = "682">
      
      <staticText>
         <reportElement x = "0" y = "50" width = "150" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[Welcome to TutorialsPoint!]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "50" width = "390" height = "40"/>
         <textElement/>
         
         <text>
           <![CDATA[<staticText>
           <reportElement x = "0" y = "50" width = "150" height = "40"/>
           <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "100" width = "150" height = "40"/>
         
         <textElement>
            <font size = "12"/>
         </textElement>
         
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "100" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "100" width = "150" height = "40"/>
            
            <textElement>
               <font size = "14"/>
            </textElement>
				
            <text> Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "150" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "150" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "250" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "DejaVu Serif" size = "12" isBold = "false"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "200" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "200" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "300" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "DejaVu Serif" size = "12" isBold = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "250" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "Monospaced" size = "12" isItalic = "true" 
               isUnderline = "true" pdfFontName = "Courier-Oblique"/>
         </textElement>
         
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "250" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "350" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "Monospaced" size = "12" isItalic = "true"
                  isUnderline = "true" pdfFontName = "Courier-Oblique"/>
            </textElement>
            
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "300" width = "150" height = "40"/>
         
         <textElement>
            <font fontName = "Monospaced" size = "12" isBold = "true"
               isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
         </textElement>
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "300" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "400" width = "150" height = "40"/>
            
            <textElement>
               <font fontName = "Monospaced" size = "12" isBold = "true"
                  isStrikeThrough = "true" pdfFontName = "Courier-Bold"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "350" width = "150" height = "40" 
            forecolor = "#FF0000"/>
         
         <textElement>
            <font size = "14"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "350" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "450" width = "150" height = "40"
               forecolor = "red"/>
            
            <textElement><font size = "14"/></textElement>
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "400" width = "150" height = "40" mode = "Opaque"
            forecolor = "#00FF00" backcolor = "#FFFF00"/>
         
         <textElement>
            <font fontName = "Serif" size = "12" isBold = "true" 
               pdfFontName = "Times-Bold"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "400" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "500" width = "150" height = "40"
               forecolor = "green" backcolor = "#FFFF00" mode = "Opaque"/>
            
            <textElement>
               <font fontName = "Serif" size = "12" isBold = "true"
                  pdfFontName = "Times-Bold"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement x = "0" y = "450" width = "150" height = "40" mode = "Opaque"
            forecolor = "#0000FF" backcolor = "#FFDD99"/>
         
         <textElement textAlignment = "Center" verticalAlignment = "Middle">
            <font fontName = "SansSerif" size = "12" isBold = "false"
            isItalic = "true" pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "450" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "550" width = "150" height = "90"
               forecolor = "blue" backcolor = "#FFDD99" mode = "Opaque"/>
            
            <textElement textAlignment = "Center" verticalAlignment = "Middle">
               <font fontName = "SansSerif" size = "12" isBold = "false"
                  pdfFontName = "Sans.Slanted" isPdfEmbedded = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      </staticText>
      
      <staticText>
         <reportElement mode = "Opaque" x = "0" y = "500" width = "150" height = "40"
            forecolor = "#FF0000" backcolor = "#99DDFF"/>
         
         <textElement textAlignment = "Right" verticalAlignment = "Bottom">
            <font fontName = "SansSerif" size = "12" isBold = "true"
               pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
         </textElement>
			
         <text><![CDATA[Welcome to TutorialsPoint!]]></text>
      </staticText>
      
      <staticText>
         <reportElement x = "160" y = "500" width = "390" height = "40"/>
         <textElement/>
         
         <text>
            <![CDATA[<staticText>
            <reportElement x = "0" y = "650" width = "150" height = "90"    forecolor = "red"
               backcolor = "#99DDFF" mode = "Opaque"/>
            
            <textElement textAlignment = "Right" verticalAlignment = "Bottom">
               <font fontName = "SansSerif" size = "12" isBold = "true"
                  pdfFontName = "DejaVu Sans Bold" isPdfEmbedded = "true"/>
            </textElement>
				
            <text>Welcome to TutorialsPoint!</text></staticText>]]>
         </text>
      
      </staticText>
   
   </band>
</title>

</jasperReport>

Код Java для заполнения и создания отчета приведен ниже. Сохраним этот файлJasperFontsReportFill.java в каталог 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 JasperFontsReportFill {
   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();
      }

   }
}

Здесь мы используем экземпляр JREmptyDataSource при заполнении отчетов для имитации источника данных с одной записью в нем, но со всеми полями, равными нулю .

Генерация отчетов

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperFontsReportFill (viewFullReport является целью по умолчанию) как -

C:\tools\jasperreports-5.0.1\test>ant -Dmain-class=com.tutorialspoint.JasperFontsReportFill
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, defaulting to build.
   [javac] Compiling 5 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperFontsReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 45 minutes 3 seconds

В результате вышеуказанной компиляции открывается окно JasperViewer, как показано на экране, приведенном ниже -

Здесь мы видим, что текст «Добро пожаловать в TutorialsPoint» отображается в разных форматах шрифтов.

В JasperReports для работы с текстами необходимы специальные инструменты для обработки как представления символов, так и свойств форматирования текста. Любой текст можно рассматривать как последовательность символов с определенной структурой представления. Внешний вид текста определяется как макетом (и абзацем), так и настройками шрифта. Но хотя в большинстве случаев макет текста остается неизменным, настройки шрифта могут измениться при запуске отчета в разных языковых стандартах.

Мы знаем, что разные языки нуждаются в разных наборах символов относительно представления определенных символов. Поэтому работать с текстами - значит работать со шрифтами. Однако подробное обсуждение того, как использовать шрифты в JasperReports, доступно в главе « Шрифты отчета» .

Одной из основных особенностей текстового контента в данном отчете является возможность его интернационализации. Это означает, что мы можем запускать отчет в разных локализованных средах, используя разные языки и другие настройки локализации без каких-либо жестко заданных изменений. Кодировка символов - важная функция, когда отчет предназначен для интернационализации.

Кодировка символов

Символ - это наименьшая единица письма, передающая значимую информацию. Это абстрактное понятие, персонаж не имеет визуального облика. «Прописная латинская буква А» - это символ, отличный от «строчной латинской буквы А», «прописной кириллицы А» и «прописной греческой альфы».

Визуальное представление персонажа известно как glyph. Определенный набор глифов называетсяfont. «Прописные буквы A», «кириллица A в верхнем регистре» и «греческие буквы в верхнем регистре» могут иметь одинаковые символы, но это разные символы. В то же время глифы для «заглавной латинской буквы А» могут выглядеть совершенно по-разному в курсиве Times New Roman, Gill Sans и Poetica, но они все равно представляют один и тот же символ.

Набор доступных персонажей называется репертуаром персонажей . Местоположение (индекс) данного символа в репертуаре называется его кодовой позицией или кодовой точкой. Метод численного представления кодовой точки в заданном репертуаре называетсяcharacter encoding.

Кодировки обычно выражаются в октетах. Октет - это группа из восьми двоичных цифр, т. Е. Восьми единиц и нулей. Октет может выражать числовой диапазон от 0 до 255 или от 0x00 до 0xFF в шестнадцатеричной системе счисления.

Unicode

Юникод - это набор символов, который содержит большинство символов, используемых в языках мира. Он может вместить миллионы символов и уже содержит сотни тысяч. Юникод разделен на «плоскости» по 64К символов. В большинстве случаев используется только первый самолет, известный как базовый многоязычный самолет, или BMP.

Рекомендуемая кодировка - UTF-8. Он использует переменное количество октетов для представления различных символов.

В файле JRXML атрибут кодировки указывается в заголовке. Он используется во время компиляции отчета для декодирования содержимого XML. Например, если отчет содержит только французские слова и такие символы, как ç, é, â, тогда достаточно кодировки ISO-8859-1 (также известной как Latin-1) -

<?xml version = "1.0" encoding = "ISO-8859-1"?>

Как видно выше, в идеале мы можем выбрать кодировку, соответствующую минимальному набору символов, которая может правильно представлять все символы в документе. Но в случае многоязычных документов (т.е. документов, содержащих слова, написанные на нескольких языках), следует выбрать кодировку, адаптированную к минимальному набору символов, способную правильно представить все символы в документе, даже если они принадлежат к разным языкам. Одной из кодировок символов, пригодной для работы с многоязычными документами, являетсяUTF-8, используется JasperReports в качестве значения кодировки по умолчанию.

Тексты обычно хранятся в файлах пакета ресурсов, а не в документе во время интернационализации. Таким образом, бывают случаи, когда сам JRXML выглядит полностью ASCII-совместимым, но сгенерированные во время выполнения отчеты содержат тексты, нечитаемые с помощью ASCII. В результате для определенного типа форматов экспорта документов (таких как CSV, HTML, XHTML, XML и текст) необходимо также знать кодировку сгенерированного документа. Для разных языков поддерживаются разные кодировки символов. Поэтому каждый раз нам нужно запускать отчет в локализованной среде. Кроме того, мы должны знать, какая кодировка символов является наиболее подходящей для языка сгенерированного документа. В этом случае свойство кодирования, определенное в самом файле JRXML, может оказаться бесполезным.

Для решения такого рода проблем мы можем использовать свойство клиента экспорта, известное как net.sf.jasperreports.export.character.encoding . Это настраиваемое свойство экспорта по умолчанию установлено в UTF-8 и присутствует в JasperReports.

Это значение по умолчанию устанавливается в файле default.jasperreports.properties . Для более конкретных параметров во время экспорта также доступен параметр экспорта CHARACTER_ENCODING.

пример

Чтобы продемонстрировать использование поддержки Unicode в Jasperreports, давайте напишем новый шаблон отчета (jasper_report_template.jrxml). Save it to C:\tools\jasperreports-5.0.1\testкаталог. Здесь мы будем отображать текст на разных языках, используя символы Unicode (\ uXXXX). Любой символ, закодированный с помощью UTF-8, может быть представлен только его 4-значным шестнадцатеричным кодом. Например, греческая буква Γ может быть записана как \ u0393. Когда встречается такая нотация, механизм вызывает соответствующее представление символа в наборе символов, и только этот конкретный символ будет распечатан. Содержимое JRXML показано ниже -

<?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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth = "555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "GreekText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0394\u03B5\u03BD "+
         "\u03BA\u03B1\u03C4\u03B1\u03BB\u03B1\u03B2\u03B1\u03AF"+
         "\u03BD\u03C9 \u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "CyrillicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u042F \u043D\u0435 "+
         "\u043C\u043E\u0433\u0443 \u043F\u043E\u043D\u044F\u0442\u044C "+
         "\u0433\u0440\u0435\u0447\u0435\u0441\u043A\u0438\u0439"]]>
      </defaultValueExpression>
   </parameter>

   <parameter name = "ArabicText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u0627\u0646\u0646\u0649 \u0644\u0627 "+
         "\u0627\u0641\u0647\u0645 \u0627\u0644\u0644\u063A\u0629 "+
         "\u0627\u0644\u0639\u0631\u0628\u064A\u0629"]]>
      </defaultValueExpression>
   </parameter>
   
   <parameter name = "HebrewText" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression><![CDATA["\u05D0\u05E0\u05D9 \u05DC\u05D0 "+
         "\u05DE\u05D1\u05D9\u05DF \u05E2\u05D1\u05E8\u05D9\u05EA"]]>
      </defaultValueExpression>
   </parameter>
   
   <title>
      <band height = "782">
         
         <textField>
            <reportElement x = "0" y = "50" width = "200" height = "60"/>
            
            <textElement>
               <font fontName = "DejaVu Sans" size = "14"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "50" width = "340" height = "60"/> <textElement/> <text> <![CDATA["GreekText and CyrillicText"]]> </text> </staticText> <textField> <reportElement x = "0" y = "120" width = "200" height = "60"/> <textElement> <font fontName = "DejaVu Sans" size = "14" isBold = "true"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "120" width = "340" height = "60"/> <textElement/> <text><![CDATA["GreekText and CyrillicText"]]></text> </staticText> <textField> <reportElement x = "0" y = "190" width = "200" height = "60"/> <textElement> <font fontName = "DejaVu Sans" size = "14" isItalic = "true" isUnderline = "true"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "190" width = "340" height = "60"/> <textElement/> <text><![CDATA["GreekText and CyrillicText"]]></text> </staticText> <textField> <reportElement x = "0" y = "260" width = "200" height = "60"/> <textElement> <font fontName = "DejaVu Sans" size = "14" isBold = "true" isItalic = "true" isUnderline = "true"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{GreekText} + "\n" + $P{CyrillicText}]]> </textFieldExpression> </textField> <staticText> <reportElement x = "210" y = "260" width = "340" height = "60"/> <textElement/> <text><![CDATA["GreekText and CyrillicText"]]></text> </staticText> <textField> <reportElement x = "0" y = "330" width = "200" height = "60"/> <textElement textAlignment = "Right"> <font fontName="DejaVu Sans" size = "22"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{ArabicText}]]>
            </textFieldExpression>
				
         </textField>
         
         <textField>
            <reportElement x = "210" y = "330" width = "340" height = "60"/>
            
            <textElement textAlignment = "Right">
               <font fontName = "DejaVu Sans" size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{HebrewText}]]>
            </textFieldExpression>
				
         </textField>
      
      </band>
   </title>
	
</jasperReport>

В приведенном выше файле мы видим наличие кодировки UTF-8. Также локализованные фрагменты текста Unicode хранятся в параметрах документа.

Код Java для заполнения и создания отчета приведен ниже. Сохраним этот файлJasperUnicodeReportFill.java в каталог 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 JasperUnicodeReportFill {
   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();
      }

   }
}

Здесь мы используем экземпляр JREmptyDataSource при заполнении отчетов для имитации источника данных с одной записью в нем, но со всеми полями в этой единственной записи равными нулю .

Генерация отчетов

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperUnicodeReportFill (viewFullReport является целью по умолчанию) следующим образом:

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.tutorialspoint.JasperUnicodeReportFill
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, defaulting t
   [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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperUnicodeReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 4 minutes 1 second

В результате вышеуказанной компиляции открывается окно JasperViewer, как показано на экране, приведенном ниже -

Здесь мы видим, что отображаемый текст на разных языках. Также мы видим, что языки сгруппированы вместе на одной странице, а также смешаны в одном текстовом элементе.

JasperReports имеет функцию <style>, которая помогает управлять свойствами текста в шаблоне отчета. Этот элемент представляет собой набор настроек стиля, объявленных на уровне отчета. Такие свойства, как цвет переднего плана, цвет фона, жирный шрифт, курсив или нормальный шрифт, размер шрифта, граница для шрифта и многие другие атрибуты управляются элементом <style>. Стили могут расширять другие стили, а также добавлять или переопределять свойства родительского стиля.

Свойства стиля

У элемента <style> много атрибутов. Некоторые из наиболее часто используемых перечислены в таблице ниже -

S.NO Атрибут и описание
1

name

Является обязательным. Он должен быть уникальным, поскольку он ссылается на соответствующий стиль отчета во всем отчете.

2

isDefault

Указывает, является ли этот стиль стилем документа по умолчанию.

3

style

Ссылка на родительский стиль.

4

mode

Задает прозрачность элемента. Возможные значения: Opaque и Transparent .

5

forecolor

Цвет переднего плана объекта.

6

backcolor

Цвет фона объекта.

7

fill

Определяет образец заливки, используемый для заливки объекта. На данный момент единственное допустимое значение - Solid .

6

radius

Задает радиус угловой дуги прямоугольника.

7

scaleImage

Задает масштаб только для изображений. Возможные значения: Clip, FillFrame, RetainShape, RealHeight и RealSize .

8

hAlign

Задает горизонтальное выравнивание. Возможные значения: Left, Center, Right и Justified .

9

vAlign

Задает вертикальное выравнивание. Возможные значения: Top, Middle и Bottom .

10

rotation

Задает поворот элемента. Возможные значения: None, Left, Right и UpsideDown .

11

lineSpacing

Задает межстрочный интервал между строками текста. Возможные значения: Single, 1_1_2, Double .

12

markup

Задает стиль разметки для стилизованного текста.

13

fontName

Задает имя шрифта.

14

fontSize

Задает размер шрифта.

15

isBold

Указывает, выделен ли стиль шрифта полужирным шрифтом.

16

isItalic

Указывает, выделен ли шрифт курсивом.

17

isUnderline

Указывает, подчеркнут ли стиль шрифта.

18

isStrikeThrough

Указывает, зачеркнут ли стиль шрифта.

19

pdfFontName

Задает имя связанного шрифта PDF.

20

pdfEncoding

Задает кодировку символов для выходного формата PDF.

22

isPdfEmbedded

Указывает, встроен ли шрифт PDF.

23

pattern

Задает шаблон формата для форматированного текста.

24

isBlankWhenNull

Указывает, должна ли отображаться пустая строка (пробел), если выражение оценивается как null.

Условные стили

В некоторых ситуациях стиль следует применять только при соблюдении определенного условия (например, для чередования цветов соседних строк в разделе сведений отчета). Этого можно добиться с помощью условных стилей.

Условный стиль состоит из двух элементов:

  • логическое выражение условия
  • стиль

Стиль используется только в том случае, если условие истинно .

Применение стилей к элементам отчета

Любой тип элемента отчета может ссылаться на определение стиля отчета с помощью атрибута style. Следовательно, все свойства стиля, объявленные определением стиля, которые применимы к текущему элементу, будут унаследованы. Чтобы переопределить унаследованные значения, можно использовать свойства стиля, указанные на уровне элемента отчета.

Шаблоны стилей

Мы можем сделать набор отчетов с единым видом, определив стиль в общем месте. На этот шаблон общего стиля затем могут ссылаться шаблоны отчетов. Шаблон стиля - это файл XML, содержащий одно или несколько определений стиля. Файлы шаблонов стилей, используемые по соглашению*.jrtx расширение, но это не обязательно.

Шаблон стиля содержит следующие элементы -

  • <jasperTemplate> - это корневой элемент файла шаблона стиля.

  • <template> - этот элемент используется для включения ссылок на другие файлы шаблонов. Содержимое этого элемента интерпретируется как расположение указанного файла шаблона.

  • <style> - этот элемент идентичен элементу с таким же именем из шаблонов дизайна отчетов (файлы JRXML), за исключением того, что стиль в шаблоне стиля не может содержать условные стили. Это ограничение вызвано тем фактом, что условные стили включают выражения отчета, а выражения могут быть интерпретированы только в контексте одного определения отчета.

Ссылки на шаблоны стилей включаются в отчеты JRXML как элементы <template>. Шаблоны стилей загружаются во время заполнения отчета, а ссылки на имена стилей разрешаются после загрузки всех шаблонов. При загрузке шаблонов стилей и преобразовании имен стилей в стили создается дерево / граф шаблонов стилей, вершиной которого является набор стилей, определенных в отчете. В этом дереве ссылки на имена стилей преобразуются в последний стиль, который соответствует имени при обходе в глубину.

пример

Давайте попробуем условные стили и шаблоны стилей. Добавим <style> элемент alternateStyleв наш существующий шаблон отчета ( Дизайн отчетов по главам ). В зависимости от условия цвет шрифта меняется на синий при четном подсчете. Мы также включили шаблон стиля"styles.jrtx". Обновленный шаблон отчета (jasper_report_template.jrxml) выглядит следующим образом. Сохраните его в каталог C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50">
	
   <template>"styles.jrtx"</template>
   
   <style name = "alternateStyle" fontName = "Arial" forecolor = "red">
      <conditionalStyle>
         <conditionExpression>
            <![CDATA[new Boolean($V{countNumber}.intValue() % 2 == 0)]]> </conditionExpression> <style forecolor = "blue" isBold = "true"/> </conditionalStyle> </style> <parameter name = "ReportTitle" class = "java.lang.String"/> <parameter name = "Author" class = "java.lang.String"/> <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> <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count"> <variableExpression><![CDATA[Boolean.TRUE]]></variableExpression> </variable> <title> <band height = "70"> <line> <reportElement x = "0" y = "0" width = "515" height = "1"/> </line> <textField isBlankWhenNull = "true" bookmarkLevel = "1"> <reportElement x = "0" y = "10" width = "515" height = "30"/> <textElement textAlignment = "Center"> <font size = "22"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression><![CDATA["Title"]]></anchorNameExpression>
         </textField>

         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <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 style = "alternateStyle" 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" 
               style = "Strong"/>
            <textElement textAlignment = "Center" verticalAlignment = "Middle" />
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>

</jasperReport>

Содержимое шаблона стиля styles.jrtxявляются следующими. Сохраните его в каталоге C: \ tools \ jasperreports-5.0.1 \ test.

<?xml version = "1.0"?>

<!DOCTYPE jasperTemplate PUBLIC "-//JasperReports//DTD Template//EN"
  "http://jasperreports.sourceforge.net/dtds/jaspertemplate.dtd">

<jasperTemplate>
   <style name = "Strong" isBold = "true" pdfFontName = "Helvetica-Bold" 
      backcolor = "lightGray forecolor = "green"/>
</jasperTemplate>

Коды java для заполнения отчетов остались без изменений. Содержимое файлаC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Содержимое файла POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java как показано ниже -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Содержимое файла C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java как показано ниже -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Генерация отчетов

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport является целью по умолчанию) как -

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, defaulting to build.sysclasspath=last;
   set to false for repeatable builds
   [javac] Compiling 3 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

В результате вышеуказанной компиляции открывается окно JasperViewer, как показано на экране, приведенном ниже -

Здесь мы видим, что цвет шрифта меняется на синий для четного подсчета (в столбце страны). В названии столбца цвет шрифта изменяется на зеленый (на этот стиль ссылается шаблон стиля).

Мы видели в наших предыдущих главах, что данные, отображаемые в отчете, обычно берутся из параметров отчета и полей отчета. Эти данные можно обрабатывать с помощью переменных отчета и их выражений. Бывают ситуации, когда сложные функции не могут быть легко достигнуты с помощью выражений или переменных отчета. Примерами этого могут быть сложные манипуляции со строками, построение карт или списков объектов в памяти или манипуляции с датами с использованием сторонних API-интерфейсов Java. Для таких ситуаций JasperReports предоставляет нам простые и мощные средства сделать это с помощьюScriptlets.

Скриплеты - это последовательности кода Java, которые выполняются каждый раз, когда происходит событие отчета. На значения переменных отчета можно воздействовать с помощью скриптлетов.

Объявление скриптлета

Мы можем объявить скриптлет двумя способами:

  • Использование <scriptlet> элемент. Этот элемент имеет атрибут имени и атрибут класса . Класс атрибут должен указать имя класса, который расширяет JRAbstractScriptlet класса. Класс должен быть доступен в пути к классам во время заполнения отчета и должен иметь пустой конструктор, чтобы механизм мог создать его экземпляр на лету.

  • Используя атрибут scriptletClass элемента <jasperReport> в шаблоне отчета (JRXML). Устанавливая этот атрибут с полным именем скриптлета (включая полное имя пакета), мы указываем, что хотим использовать скриптлет. Экземпляр скриптлета, созданный с этим атрибутом, действует как первый скриптлет в списке скриптлетов и имеет предопределенное имя REPORT.

Класс скриптлета

Скриплет - это класс java, который должен расширять любой из следующих классов:

  • net.sf.jasperreports.engine.JRAbstractScriptlet- Этот класс содержит ряд абстрактных методов, которые необходимо переопределить в каждой реализации. Эти методы автоматически вызываются JasperReports в подходящий момент. Разработчик должен реализовать все абстрактные методы.

  • net.sf.jasperreports.engine.JRDefaultScriptlet- Этот класс содержит пустые реализации по умолчанию для каждого метода в JRAbstractScriptlet. От разработчика требуется реализовать только те методы, которые ему необходимы для его проекта.

В следующей таблице перечислены методы указанного выше класса. Эти методы будут вызываться механизмом отчетов в соответствующее время на этапе заполнения отчета.

S.NO Метод и описание
1

public void beforeReportInit()

Вызывается перед инициализацией отчета.

2

public void afterReportInit()

Вызывается после инициализации отчета.

3

public void beforePageInit()

Вызывается перед инициализацией каждой страницы.

4

public void afterPageInit()

Вызывается после инициализации каждой страницы.

5

public void beforeColumnInit()

Вызывается перед инициализацией каждого столбца.

6

public void afterColumnInit()

Вызывается после инициализации каждого столбца.

7

public void beforeGroupInit(String groupName)

Вызывается перед инициализацией группы, указанной в параметре.

8

public void afterGroupInit(String groupName)

Вызывается после инициализации группы, указанной в параметре.

9

public void beforeDetailEval()

Вызывается перед оценкой каждой записи в подробном разделе отчета.

10

public void afterDetailEval()

Вызывается после оценки каждой записи в подробном разделе отчета.

Для каждого отчета можно указать любое количество скриптлетов. Если для отчета не указан скриптлет, механизм по-прежнему создает один экземпляр JRDefaultScriptlet и регистрирует его с помощью встроенного параметра REPORT_SCRIPTLET.

Мы можем добавить любые дополнительные методы в наши скриптлеты. Отчеты могут вызывать эти методы с помощью встроенного параметра REPORT_SCRIPTLET.

Глобальные скрипты

Мы можем связать скриптлеты с отчетами другим способом, то есть объявив скриптлеты глобально. Это заставляет скриптлеты применяться ко всем отчетам, заполняемым в данном развертывании JasperReports. Это упрощается за счет того, что скриптлеты можно добавлять в JasperReports как расширения. Точка расширения скриптлета представлена интерфейсом net.sf.jasperreports.engine.scriptlets.ScriptletFactory . JasperReports загрузит все фабрики скриптлетов, доступные через расширения во время выполнения. Затем он запросит у каждого из них список экземпляров скриптлетов, которые они хотят применить к текущему запускаемому отчету. При запросе списка экземпляров скриптлетов движок предоставляет некоторую контекстную информацию, которую фабрика может использовать, чтобы решить, какие скриптлеты действительно применяются к текущему отчету.

Отчет управляющих

Регуляторы - это просто расширение глобальных скриптлетов, которые позволяют нам решать проблему перехода механизма отчетов в бесконечный цикл во время выполнения при создании отчетов. Неверные шаблоны отчетов не могут быть обнаружены во время разработки, поскольку в большинстве случаев условия для входа в бесконечные циклы зависят от фактических данных, которые вводятся в механизм во время выполнения. Регуляторы отчетов помогают решить, попал ли определенный отчет в бесконечный цикл, и могут его остановить. Это предотвращает исчерпание ресурсов для машины, на которой выполняется отчет.

В JasperReports есть два простых регулятора отчетов, которые останавливают выполнение отчета на основе указанного максимального количества страниц или указанного интервала тайм-аута. Они -

  • net.sf.jasperreports.governors.MaxPagesGovernor- Это глобальный скриптлет, который ищет два свойства конфигурации, чтобы решить, применимо ли оно к текущему отчету. Свойства конфигурации:

    • net.sf.jasperreports.governor.max.pages.enabled=[true|false]

    • net.sf.jasperreports.governor.max.pages=[integer]

  • net.sf.jasperreports.governors.TimeoutGovernor- Это также глобальный скриптлет, который ищет следующие два свойства конфигурации, чтобы решить, применяется он или нет.

    Свойства конфигурации:

    • net.sf.jasperreports.governor.timeout.enabled=[true|false]

    • net.sf.jasperreports.governor.timeout=[milliseconds]

Свойства для обоих регуляторов могут быть установлены глобально в файле jasperreports.properties или на уровне отчета как свойства настраиваемого отчета. Это полезно, потому что разные отчеты могут иметь разный предполагаемый размер или пределы тайм-аута, а также потому, что вы можете включить регуляторы для всех отчетов, отключив их для некоторых, или наоборот.

пример

Напишем класс скриптлета (MyScriptlet). Содержимое файла C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \ MyScriptlet.java выглядит следующим образом:

package com.tutorialspoint;

import net.sf.jasperreports.engine.JRDefaultScriptlet;
import net.sf.jasperreports.engine.JRScriptletException;


public class MyScriptlet extends JRDefaultScriptlet {

   public void afterReportInit() throws JRScriptletException{
      System.out.println("call afterReportInit()");
      // this.setVariableValue("AllCountries", sbuffer.toString());
      this.setVariableValue("someVar", new String("This variable value 
         was modified by the scriptlet."));
   }

   public String hello() throws JRScriptletException {
      return "Hello! I'm the report's scriptlet object.";
   }

}

Подробности вышеупомянутого класса скриптлета следующие:

  • В методе afterReportInit мы устанавливаем значение переменной"someVar" this.setVariableValue ("someVar", new String ("Значение этой переменной было изменено скриптлетом.")).

  • В конце класса дополнительный метод называется 'hello'был определен. Это пример метода, который может быть добавлен в скриптлет, который фактически возвращает значение, а не устанавливает переменную.

Затем мы добавим ссылку на класс скриптлета в наш существующий шаблон отчета (Глава Report Designs ). Обновленный шаблон отчета (jasper_report_template.jrxml) выглядит следующим образом. Сохраните его в каталог C: \ tools \ jasperreports-5.0.1 \ test -

<?xml version = "1.0"?>
<!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" pageWidth = "595"
   pageHeight = "842" columnWidth = "515"
   leftMargin = "40" rightMargin = "40" topMargin = "50" bottomMargin = "50"
   scriptletClass = "com.tutorialspoint.MyScriptlet">
	
   <style name = "alternateStyle" fontName = "Arial" forecolor = "red">
      
      <conditionalStyle>
         <conditionExpression>
            <![CDATA[new Boolean($V{countNumber}.intValue() % 2 == 0)]]> </conditionExpression> <style forecolor = "blue" isBold = "true"/> </conditionalStyle> </style> <parameter name = "ReportTitle" class = "java.lang.String"/> <parameter name = "Author" class = "java.lang.String"/> <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> <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count"> <variableExpression>< ![CDATA[Boolean.TRUE]]> </variableExpression> </variable> <variable name = "someVar" class = "java.lang.String"> <initialValueExpression> <![CDATA["This is the initial variable value."]]> </initialValueExpression> </variable> <title> <band height = "100"> <line> <reportElement x = "0" y = "0" width = "515" height = "1"/> </line> <textField isBlankWhenNull = "true" bookmarkLevel = "1"> <reportElement x = "0" y = "10" width = "515" height = "30"/> <textElement textAlignment = "Center"> <font size = "22"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
				
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
        
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> <textField isBlankWhenNull = "true"> <reportElement x = "0" y = "50" width = "515" height = "30" forecolor = "#993300"/> <textElement textAlignment = "Center"> <font size = "10"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$V{someVar}]]>
            </textFieldExpression>
				
         </textField>

      </band>
   </title>

   <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 style = "alternateStyle" 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>
   
   <summary>
      <band height = "45">
            
         <textField isStretchWithOverflow = "true">
            <reportElement x = "0" y = "10" width = "515" height = "15" />
            <textElement textAlignment = "Center"/>
               
            <textFieldExpression class = "java.lang.String">
               <![CDATA["There are " + String.valueOf($V{REPORT_COUNT}) + " records on this report."]]> </textFieldExpression> </textField> <textField isStretchWithOverflow = "true"> <reportElement positionType = "Float" x = "0" y = "30" width = "515" height = "15" forecolor = "# 993300" /> <textElement textAlignment = "Center"> <font size = "10"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$P{REPORT_SCRIPTLET}.hello()]]>
            </textFieldExpression>
            
         </textField>
         
      </band>
   </summary>
	
</jasperReport>

Подробная информация о пересмотренном шаблоне отчета приведена ниже -

  • Мы указали класс MyScriptlet в атрибуте scriptletClass элемента <jasperReport>.

  • Сценарии могут только получать доступ, но не изменять поля и параметры отчета. Однако скриптлеты могут изменять значения переменных отчета. Это можно сделать, вызвав метод setVariableValue (). Этот метод определен в классе JRAbstractScriptlet, который всегда является родительским классом любого скриптлета. Здесь мы определили переменную someVar , которая будет изменена MyScriptlet, чтобы иметь значение This value было изменено скриптлетом .

  • В приведенном выше шаблоне отчета есть вызов метода в полосе Сводка, который показывает, как писать новые методы (в скриптлетах) и использовать их в шаблоне отчета. ($P{REPORT_SCRIPTLET}.hello())

Коды java для заполнения отчетов остались без изменений. Содержимое файлаC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Содержимое файла POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java приведены ниже -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Содержимое файла C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Генерация отчетов

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport является целью по умолчанию) как -

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, defaulting to bu
   [javac] Compiling 4 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.
   [java] call afterReportInit()
   [java] call afterReportInit()

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 18 minutes 49 seconds

В результате вышеуказанной компиляции открывается окно JasperViewer, как показано на экране, приведенном ниже -

Здесь мы видим, что из класса MyScriptlet отображаются два сообщения:

  • В разделе заголовка - значение этой переменной было изменено скриптлетом
  • Внизу - Привет! Я - объект скриптлета отчета.

Вложенные отчеты - одна из приятных особенностей JasperReports. Эта функция позволяет включать отчет в другой отчет, то есть один отчет может быть подотчетом другого. Вложенные отчеты помогают нам сохранять простой дизайн отчетов, поскольку мы можем создавать множество простых отчетов и включать их в основной отчет. Подотчеты составляются и заполняются так же, как и обычные отчеты. Любой шаблон отчета можно использовать в качестве подотчета при включении в другой шаблон отчета без каких-либо изменений внутри (шаблона отчета).

Вложенные отчеты похожи на обычные шаблоны отчетов. На самом деле это объекты net.sf.jasperreports.engine.JasperReport , которые получаются после компиляции объекта net.sf.jasperreports.engine.design.JasperDesign .

<subreport> Элемент

Элемент <subreport> используется при добавлении вложенных отчетов в основные отчеты. Вот список подэлементов в элементе <subreport> JRXML.

  • <reportElement>

  • <parametersMapExpression> - используется для передачи карты, содержащей параметры отчета, в подотчет. Карта обычно получается из параметра в главном отчете или с помощью встроенного параметра REPORTS_PARAMETERS_MAP для передачи параметров родительского отчета во вложенный отчет. Это выражение всегда должно возвращать объект java.util.Map, в котором ключи являются именами параметров.

  • <subreportParameter> - этот элемент используется для передачи параметров во вложенный отчет. У него есть обязательное имя атрибута .

  • <connectionExpression> - используется для передачи java.sql.Connection в подотчет. Он используется только в том случае, если шаблон подотчета требует подключения к базе данных на этапе заполнения отчета.

  • <dataSourceExpression> - используется для передачи источника данных во вложенный отчет. Этот источник данных обычно получается из параметра в главном отчете или с помощью встроенного параметра REPORT_DATA_SOURCE для передачи источника данных родительского отчета во вложенный отчет.

  • Элементы ( connectionExpression и dataSourceExpression ) не могут одновременно присутствовать в объявлении элемента <subreport>. Это связано с тем, что мы не можем предоставить одновременно источник данных и подключение к подотчету. Мы должны выбрать один из них и придерживаться его.

  • <returnValue> - используется для присвоения значения одной из переменных подотчета одной из переменных главного отчета. Этот подэлемент имеет следующие атрибуты -

    • subreportVariable - этот атрибут определяет имя переменной вложенного отчета, значение которой должно быть возвращено.

    • toVariable - этот атрибут определяет имя родительской переменной отчета, значение которой должно быть скопировано / увеличено на значение из подотчета.

    • вычисление - этот атрибут может принимать значения: Nothing, Count, DistinctCount, Sum, Average, Lowest, Highest, StandardDeviation, Variance. Значение по умолчанию для расчета атрибута - «Ничего».

    • incrementerFactoryClass - этот атрибут определяет класс фабрики для создания экземпляра инкрементатора.

  • <subreportExpression> - указывает, где найти скомпилированный шаблон отчета для вложенного отчета. Этот элемент имеетclassатрибут. Класс атрибута может принимать любое из этих значений: java.lang.String, java.io.File, java.net.URL, java.io.InputStream, net.sf.jasperreports.engine.JasperReport. Значение по умолчанию - java.lang.String .

  • isUsingCache - это атрибут элемента <subreport>. Это логическое значение. Если задано значение true , механизм отчетов попытается распознать ранее загруженные объекты шаблона подотчета, используя их указанный источник. Эта функция кэширования доступна только для элементов вложенного отчета, в которых есть выражения, возвращающие объекты java.lang.String в качестве источника шаблона вложенного отчета, представляющие имена файлов, URL-адреса или ресурсы пути к классам.

пример

Давайте рассмотрим простой пример, чтобы продемонстрировать создание вложенных отчетов с использованием JRDataSource. Давайте сначала напишем два новых шаблона отчетов, один из которых будет подотчетом, а другой - основным отчетом. Содержание шаблона подотчета (address_report_template.jrxml) приведено ниже. Сохраните его в каталоге C: \ tools \ jasperreports-5.0.1 \ test.

<?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 = "address_report_template" pageWidth = "175" pageHeight = "842" 
   columnWidth = "175" leftMargin = "0" rightMargin = "0" 
   topMargin = "0" bottomMargin = "0">

   <field name = "city" class = "java.lang.String"/>
   <field name = "street" class = "java.lang.String"/>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "20" splitType = "Stretch">
         
         <staticText>
            <reportElement x = "0" y = "0" width = "100" height = "20"/>
            
            <textElement>
               <font size = "14" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Addresses]]></text>
         </staticText>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "12" splitType = "Stretch"/>
   </pageHeader>
   
   <columnHeader>
      <band height = "12" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "27" splitType = "Stretch">
         
         <textField>
            <reportElement x = "0" y = "0" width = "120" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{city}+" Address:"]]> </textFieldExpression> </textField> <textField isStretchWithOverflow = "true"> <reportElement x = "120" y = "0" width = "435" height = "20"/> <textElement> <font size = "12"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$F{street}]]>
            </textFieldExpression>
         </textField>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "8" splitType = "Stretch"/>
   </columnFooter>
  
   <pageFooter>
      <band height = "11" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "9" splitType = "Stretch"/>
   </summary>

</jasperReport>

Поскольку мы используем источник данных, нам нужно написать соответствующий файл POJO SubReportBean.java как показано ниже. Сохраните его в каталоге C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint -

package com.tutorialspoint;

public class SubReportBean {
   private String city;
   private String street;

   public String getCity() {
      return city;
   }

   public void setCity(String city) {
      this.city = city;
   }

   public String getStreet() {
      return street;
   }

   public void setStreet(String street) {
      this.street = street;
   }
}

Здесь мы объявили два поля «город» и «улица» и определены соответствующие методы получения и установки.

Теперь давайте обновим наши существующие DataBeanфайл. Мы добавим новое поле subReportBeanList , которое представляет собой java.util.List. Это поле будет содержать список объектов SubReportBean. Содержимое файла DataBean показано ниже. Сохраните его в каталоге C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint.

package com.tutorialspoint;

import java.util.List;

public class DataBean {
   private String name;
   private String country;
   private List<SubReportBean> subReportBeanList;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }

   public List<SubReportBean> getSubReportBeanList() {
      return subReportBeanList;
   }

   public void setSubReportBeanList(List<SubReportBean> subReportBeanList) {
      this.subReportBeanList = subReportBeanList;
   }
}

Теперь давайте обновим файл C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint \DataBeanList.java. Содержимое этого файла выглядит так:

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {

      // Create sub report data
      SubReportBean subBean1 = new SubReportBean();
      subBean1.setCity("Mumbai");
      subBean1.setStreet("M.G.Road");
      SubReportBean subBean2 = new SubReportBean();
      subBean2.setCity("New York");
      subBean2.setStreet("Park Street");
      SubReportBean subBean3 = new SubReportBean();
      subBean3.setCity("San Fransisco");
      subBean3.setStreet("King Street");

      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      // Create master report data
      dataBeanList.add(produce("Manisha", "India",
         Arrays.asList(subBean1)));
      dataBeanList.add(produce("Dennis Ritchie", "USA",
         Arrays.asList(subBean2)));
      dataBeanList.add(produce("V.Anand", "India",
         Arrays.asList(subBean1)));
      dataBeanList.add(produce("Shrinath", "California",
         Arrays.asList(subBean3)));

      return dataBeanList;
   }

   /*
    * This method returns a DataBean object,
    * with name, country and sub report
    * bean data set in it.
    */
   private DataBean produce(String name, String country,
      List<SubReportBean> subBean) {
      DataBean dataBean = new DataBean();

      dataBean.setName(name);
      dataBean.setCountry(country);
      dataBean.setSubReportBeanList(subBean);

      return dataBean;
   }
}

В методе generate () в приведенном выше файле мы устанавливаем список SubReportBean.

Теперь давайте напишем новый шаблон главного отчета (jasper_report_template.jrxml). Сохраните этот файл в каталогC:\tools\jasperreports-5.0.1\test. Содержимое этого файла показано ниже -

<?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" language = "groovy" pageWidth = "595"
   pageHeight = "842" columnWidth ="555" leftMargin = "20" rightMargin = "20"
   topMargin = "20" bottomMargin = "20">

   <parameter name = "SUBREPORT_DIR" class = "java.lang.String" isForPrompting = "false">
      <defaultValueExpression>
         <![CDATA["C:\\tools\\jasperreports-5.0.1\\test\\"]]>
      </defaultValueExpression>
   </parameter>
   
   <field name = "country" class = "java.lang.String"/>
   <field name = "name" class = "java.lang.String"/>
   <field name = "subReportBeanList" class = "java.util.List"/>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "35" splitType = "Stretch">
         
         <staticText>
            <reportElement x = "0" y = "0" width = "204" height = "34"/>
            
            <textElement>
               <font size = "26" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Contact Report]]></text>
         </staticText>
      
      </band>
   </title>
   
   <pageHeader>
      <band height = "17" splitType = "Stretch"/>
   </pageHeader>
   
   <columnHeader>
      <band height = "21" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "112" splitType = "Stretch">
            
         <staticText>
            <reportElement x = "0" y = "0" width = "100" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Name:]]></text>
         </staticText>
         
         <staticText>
            <reportElement x = "0" y = "20" width = "100" height = "20"/>
            
            <textElement>
               <font size = "12" isBold = "true"/>
            </textElement>
				
            <text><![CDATA[Country:]]></text>
         </staticText>
         
         <textField>
            <reportElement x = "104" y = "0" width = "277" height = "20"/>
            
            <textElement>
               <font size = "12"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$F{name}]]> </textFieldExpression> </textField> <textField> <reportElement x = "104" y = "20" width = "277" height = "20"/> <textElement> <font size = "12"/> </textElement> <textFieldExpression class = "java.lang.String"> <![CDATA[$F{country}]]>
            </textFieldExpression>
         </textField>
         
         <subreport>
            <reportElement positionType = "Float" x = "335" y = "25" width = "175"
               height = "20" isRemoveLineWhenBlank = "true" backcolor = "#99ccff"/>

            <dataSourceExpression>
               new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource
                  ($F{subReportBeanList}) </dataSourceExpression> <subreportExpression class = "java.lang.String"> <![CDATA[$P{SUBREPORT_DIR} + "address_report_template.jasper"]]>
            </subreportExpression>
         </subreport>
         
         <line>
            <reportElement x = "0" y = "50" width = "550" height = "1"/>
         </line>
      
      </band>
   </detail>
   
   <columnFooter>
      <band height = "19" splitType = "Stretch"/>
   </columnFooter>
   
   <pageFooter>
      <band height = "18" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "14" splitType = "Stretch"/>
   </summary>

</jasperReport>

В приведенном выше шаблоне мы определили новый параметр «SUBREPORT_DIR», который определяет путь к вложенному отчету. Мы определили поле subReportBeanList типа java.util.List, которое соответствует свойству в файле DataBean. Элемент <subreport> имеет вложенный элемент <dataSourceExpression>. Мы поместили список subReportBeanList в экземпляр JRBeanCollectionDataSource. В подэлементе <subreportExpression /> мы указали имя подотчета (AddressReport.jasper).

Теперь напишем новый класс CreateReportдля компиляции и выполнения нашего шаблона отчета. Содержимое файлаC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\CreateReport.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class CreateReport {

   public static void main(String[] args) {
      String masterReportFileName = "C://tools/jasperreports-5.0.1/test"
         + "/jasper_report_template.jrxml";
      String subReportFileName = "C://tools/jasperreports-5.0.1/test"
         + "/AddressReport.jrxml";
      String destFileName = "C://tools/jasperreports-5.0.1/test"
         + "/jasper_report_template.JRprint";
			
      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();
      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      try {
         /* Compile the master and sub report */
         JasperReport jasperMasterReport = JasperCompileManager
            .compileReport(masterReportFileName);
         JasperReport jasperSubReport = JasperCompileManager
            .compileReport(subReportFileName);

         Map<String, Object> parameters = new HashMap<String, Object>();
         parameters.put("subreportParameter", jasperSubReport);
         JasperFillManager.fillReportToFile(jasperMasterReport, 
            destFileName, parameters, beanColDataSource);

      } catch (JRException e) {

         e.printStackTrace();
      }
      System.out.println("Done filling!!! ...");
   }
}

Здесь мы видим, что мы компилируем как главный, так и подчиненный шаблоны отчетов и передаем файл главного отчета (.jasper) для заполнения отчета.

Генерация отчетов

Теперь все наши файлы готовы, давайте скомпилируем и выполним их, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.CreateReport (viewFullReport является целью по умолчанию) следующим образом:

Buildfile: C:\tools\jasperreports-5.0.1\test\build.xml

clean-sample:
   [delete] Deleting directory C:\tools\jasperreports-5.0.1\test\classes

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, defaulting to
   [javac] Compiling 7 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.CreateReport
   [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 filling!!! ...

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 72 minutes 13 seconds

В результате вышеуказанной компиляции открывается окно JasperViewer, как показано на экране, приведенном ниже -

Здесь мы видим, что отображаются атрибуты Name, Country и Address.

Раньше людям приходилось полагаться на скриптлеты для сбора данных диаграммы и визуализации диаграммы с использованием элемента изображения в шаблоне отчета. JasperReports упрощает задачу, поскольку имеет встроенную поддержку диаграмм с использованием нового компонента диаграммы.

Используя новый компонент диаграммы, пользователю необходимо применить только визуальные настройки и определить выражения, которые помогут построить набор данных диаграммы. JasperReports использует JFreeChart в качестве базовой библиотеки диаграмм. При настройке нового компонента диаграммы задействованы следующие три компонента:

  • Компонент общей диаграммы.

  • Набор данных диаграммы (который группирует настройки, связанные с данными диаграммы).

  • График диаграммы (который группирует визуальные настройки, связанные со способом отображения элементов диаграммы).

JasperReports в настоящее время поддерживает следующие типы диаграмм: круговая диаграмма, круговая диаграмма 3D, столбик, столбик 3D, столбец XY, столбик с накоплением, столбец с накоплением 3D, линия, линия XY, площадь, область XY, область с накоплением, разброс, пузырь, временной ряд, высокий -Low-Open-Close, Candlestick, Multi Axis, Meter, Thermometer и Gantt.

Свойства диаграммы

Диаграммы являются обычными элементами отчета, поэтому они имеют общие свойства со всеми другими элементами отчета. Существует элемент JRXML с именем <chart>, используется для создания всех типов диаграмм. Этот элемент группирует специальные настройки для диаграмм, которые применяются ко всем типам диаграмм.

Подэлементы диаграммы

Подэлементы элемента <chart>:

  • <reportElement> - Это отображаемые объекты, такие как статический текст, текстовые поля, изображения, линии и прямоугольники, которые вы помещаете в разделы шаблона отчета.

  • <Box> - Этот элемент используется для окружения диаграмм рамкой, настраиваемой с каждой стороны.

  • <chartTitle>- Этот элемент используется для размещения заголовка диаграммы. Позиция атрибут определяет название позиции диаграммы в отчете. У этого элемента есть атрибуты -Position(Значения могут быть Top , Bottom , Left , Right . Для глухих - Top ),color. <chartTitle> имеет font и titleExpression в качестве подэлементов.

  • <chartSubtitle>- Этот элемент используется для размещения подзаголовка диаграммы. Этот элемент имеет атрибут -color. <chartSubtitle> имеет font и subtitleExpression в качестве подэлементов.

  • <chartLegend>- С помощью этого элемента элемент может управлять свойствами шрифта, а также цветом текста и цветом фона легенды диаграммы. У этого элемента есть атрибуты -textColor и backgroundColor.

  • <anchorNameExpression> - Этот элемент создает цель для якоря.

  • <hyperlinkReferenceExpression> - Этот элемент содержит выражение отчета, указывающее имя внешнего ресурса (обычно URL).

  • <hyperlinkAnchorExpression> - Гиперссылка указывает на привязку во внешнем ресурсе.

  • <hyperlinkPageExpression> - Гиперссылка указывает на страницу в текущем отчете.

  • <hyperlinkTooltipExpression>- Этот элемент управляет всплывающей подсказкой гиперссылки. Тип выражения должен быть java.lang.String .

  • <hyperlinkParameter> - Этот элемент, если он присутствует, генерирует последнюю гиперссылку в зависимости от значений параметров.

Атрибуты диаграммы

Атрибуты в элементе <chart>, доступные для всех типов диаграмм:

  • isShowLegend- Этот атрибут используется для определения, будет ли в отчете отображаться легенда диаграммы. Значения могут быть истинными или ложными . Значение по умолчанию - истина .

  • evaluationTime- Определяет, когда будет оцениваться выражение диаграммы. Значения могут быть Сейчас , Отчет , Страница , Столбец , Группа , Группа . Значение по умолчанию - Сейчас .

  • evaluationGroup- Этот атрибут определяет имя группы, которая будет использоваться для оценки выражений диаграммы. Значение этого атрибута должно совпадать с названием группы, которую мы хотели бы использовать в качестве группы оценки диаграммы.

  • hyperlinkType- Этот атрибут может содержать любое текстовое значение. Значение по умолчанию - Нет . Это означает, что ни текстовые поля, ни изображения не представляют гиперссылки, даже если присутствуют специальные выражения гиперссылок.

  • hyperlinkTarget- Этот атрибут помогает настроить поведение указанной ссылки при щелчке по ней в средстве просмотра. Значения могут быть собственными или пустыми . Значение по умолчанию - Self .

  • bookmarkLevel- Если для этого атрибута задано положительное целое число, создаются закладки в отчетах, экспортируемых в PDF. Значение по умолчанию - 0 .

  • customizerClass- Это имя класса (необязательно), который можно использовать для настройки диаграммы. Значением этого элемента должна быть строка, содержащая имя класса настройщика.

Настройка диаграммы

Как упоминалось выше, JasperReports использует JFreeChart в качестве базовой библиотеки диаграмм. JFreeChart содержит функции, которые напрямую не поддерживаются JasperReports. Мы можем воспользоваться этими функциями, предоставив класс настройщика через атрибут customizerClass в элементе <chart>. Класс настройщика - это не что иное, как реализация интерфейса net.sf.jasperreports.engine.JRChartCustomizer . Самый простой способ реализовать этот интерфейс - расширить класс net.sf.jasperreports.engine.JRAbstractChartCustomizer и, таким образом, получить доступ к параметрам, полям и переменным для более гибкой настройки диаграммы на основе данных отчета.

Наборы данных диаграмм

Одно из общих свойств для всех типов диаграмм - <dataset> элемент. Наборы данных диаграммы помогают отображать данные отчета и извлекать данные диаграммы во время выполнения. Каждый тип диаграммы содержит различные подэлементы для определения выражений диаграммы. Эти выражения определяют данные, используемые для создания диаграммы. Все эти подэлементы содержат элемент <dataset>, который определяет, когда выражения диаграммы оцениваются и сбрасываются.

В JasperReports доступно несколько типов наборов данных диаграмм, поскольку каждый тип диаграммы работает с определенными наборами данных: круговая диаграмма, категория, XY, временной ряд, период времени, XYZ и максимум-минимум. Каждый из этих типов наборов данных реализует интерфейс net.sf.jasperreports.engine.JRChartDataset, который определяет наборы данных диаграммы. Все наборы данных диаграммы инициализируются и увеличиваются одинаково; однако они различаются только типом данных или рядов данных, которые они отображают.

Свойства набора данных

В таблице ниже приведены атрибуты элемента <dataset> -

Атрибут Описание Значения
resetType Этот атрибут определяет, когда следует сбросить значение выражения диаграммы. Нет, Отчет, Страница, Столбец, Группа. Значение по умолчаниюReport.
resetGroup Этот атрибут определяет имя группы, в которой значение выражения диаграммы сбрасывается. Значение этого атрибута должно совпадать с именем любой группы, объявленной в шаблоне отчета JRXML.
incrementType Этот атрибут определяет, когда следует пересчитывать значение выражения диаграммы. Нет, Отчет, Страница, Столбец, Группа. Значение по умолчанию"None".
incrementGroup Этот атрибут определяет имя группы, в которой пересчитывается выражение диаграммы. Значение этого атрибута должно соответствовать имени группы, объявленной в шаблоне отчета JRXML.

В следующей таблице приведены подэлементы элемента <dataset> -

Подэлемент Описание
<incrementWhenExpression> Способ увеличения набора данных диаграммы можно настроить, отфильтровав нежелательные данные с помощью этого подэлемента.
<datasetRun> Он содержит информацию, необходимую для создания поднабора данных отчета.

Типы наборов данных

Конкретные типы наборов данных объясняются ниже -

Набор данных пирога

Набор данных пирога характеризуется следующими выражениями -

  • <keyExpression> - представляет категории, которые будут составлять части круговой диаграммы. Это выражение может возвращать любой объект java.lang.Comparable.

  • <valueExpression> - производит значения, соответствующие каждой категории / ключу в наборе данных. Значения всегда являются объектами java.lang.Number.

  • <labelExpression> - если это выражение отсутствует, на диаграмме будут отображаться метки по умолчанию для каждого фрагмента круговой диаграммы. Используйте это выражение, которое возвращает значения java.lang.String, чтобы настроить метки элементов для круговой диаграммы.

  • <sectionHyperlink> - устанавливает гиперссылки, связанные с секциями круговой диаграммы.

Категория Набор данных

Набор данных категории характеризуется элементом <categorySeries>, который содержит:

  • <seriesExpression> - указывает название серии. Это выражение может возвращать любой объект java.lang.Comparable.

  • <categoryExpression> - возвращает имя категории для каждого значения внутри ряда, указанного выражением ряда. Категории - это объекты java.lang.Comparable.

  • <valueExpression> - производит значения, соответствующие каждой категории в наборе данных. Значения всегда являются объектами java.lang.Number.

  • <labelExpression> - если это выражение отсутствует, на диаграмме будут отображаться метки по умолчанию для каждого элемента диаграммы. Используйте это выражение, которое возвращает значения java.lang.String, чтобы настроить метки элементов для диаграммы.

  • <itemHyperlink> - устанавливает гиперссылки, связанные с элементами диаграммы.

Набор данных XY

Набор данных XY характеризуется элементом <xySeries>, который содержит:

  • <seriesExpression> - указывает название серии. Это выражение может возвращать любой объект java.lang.Comparable.

  • <xValueExpression> - возвращает значение java.lang.Number, представляющее значение X из пары (x, y), которая будет добавлена ​​к текущему ряду данных.

  • <yValueExpression> - возвращает значение java.lang.Number, представляющее значение Y из пары (x, y), которая будет добавлена ​​к текущему ряду данных.

  • <labelExpression> - если это выражение отсутствует, на диаграмме будут отображаться метки по умолчанию для каждого элемента диаграммы. Используйте это выражение, которое возвращает значения java.lang.String, чтобы настроить метки элементов для диаграммы.

  • <itemHyperlink> - устанавливает гиперссылки, связанные с элементами диаграммы.

Набор данных XYZ

Набор данных XYZ характеризуется элементом <xyzSeries>, который содержит:

  • <seriesExpression> - указывает название серии. Это выражение может возвращать любой объект java.lang.Comparable.

  • <xValueExpression> - возвращает значение java.lang.Number, представляющее значение X из элемента (x, y, z), который будет добавлен к текущей серии данных.

  • <yValueExpression> - возвращает значение java.lang.Number, представляющее значение Y из элемента (x, y, z), который будет добавлен в текущий ряд данных.

  • <zValueExpression> - возвращает значение java.lang.Number, представляющее значение Z из элемента (x, y, z), которое будет добавлено к текущему ряду данных.

  • <labelExpression> - если это выражение отсутствует, на диаграмме будут отображаться метки по умолчанию для каждого элемента диаграммы. Используйте это выражение, которое возвращает значения java.lang.String, чтобы настроить метки элементов для диаграммы.

  • <itemHyperlink> - устанавливает гиперссылки, связанные с элементами диаграммы.

Набор данных временных рядов

Набор данных временных рядов характеризуется атрибутом timePeriod и элементом <timeSeries>. Атрибут timePeriod указывает тип ряда данных внутри набора данных. Временные ряды могут содержать числовые значения, связанные с днями, месяцами, годами или другими предопределенными периодами времени. Возможные значения: Год, Квартал, Месяц, Неделя, День - это значение по умолчанию, Час, Минута, Секунда, Миллисекунда.

Элемент <timeSeries> содержит -

  • <seriesExpression> - указывает название серии. Это выражение может возвращать любой объект java.lang.Comparable.

  • <timePeriodExpression> - возвращает значение java.util.Date, из которого движок будет извлекать соответствующий период времени в зависимости от значения, установленного для атрибута timePeriod, упомянутого выше.

  • <valueExpression> - возвращает значение java.lang.Number, которое нужно связать с соответствующим значением периода времени при увеличении текущего ряда набора данных.

  • <labelExpression> - если это выражение отсутствует, на диаграмме будут отображаться метки по умолчанию для каждого элемента диаграммы. Используйте это выражение, которое возвращает значения java.lang.String, чтобы настроить метки элементов для диаграммы.

  • <itemHyperlink> - устанавливает гиперссылки, связанные с элементами диаграммы.

Набор данных периода времени

Набор данных периода времени характеризуется элементом <timePeriodSeries>, который содержит -

  • <seriesExpression> - указывает название серии. Это выражение может возвращать любой объект java.lang.Comparable.

  • <startDateExpression> - указывает начало интервала дат, с которым будет связано числовое значение при добавлении к ряду временного периода.

  • <endDateExpression> - указывает конец интервала дат, с которым будет связано числовое значение при добавлении к ряду временного периода.

  • <valueExpression> - возвращает значение java.lang.Number для связи с текущим интервалом дат, заданным выражениями даты начала и даты окончания.

  • <labelExpression> - если это выражение отсутствует, на диаграмме будут отображаться метки по умолчанию для каждого элемента диаграммы. Используйте это выражение, которое возвращает значения java.lang.String, чтобы настроить метки элементов для диаграммы.

  • <itemHyperlink> - устанавливает гиперссылки, связанные с элементами диаграммы.

Высокий низкий набор данных

Набор данных с высоким и низким уровнем характеризуется следующими выражениями:

  • <seriesExpression> - в настоящее время поддерживается только одна серия на графике High-Low или Candlestick. Однако этот отдельный ряд должен быть идентифицирован значением java.lang.Comparable, возвращаемым этим выражением, и его также следует использовать в качестве имени ряда в легенде диаграммы.

  • <dateExpression> - возвращает дату, к которой относится текущий элемент (максимум, минимум, открытие, закрытие, объем).

  • <highExpression> - возвращает значение java.lang.Number, которое будет частью элемента данных, добавляемого в серию при увеличении набора данных.

  • <lowExpression> - возвращает значение java.lang.Number, которое будет частью элемента данных, добавляемого к серии при увеличении набора данных.

  • <openExpression> - возвращает значение java.lang.Number, которое будет частью элемента данных, добавляемого в серию при увеличении набора данных.

  • <closeExpression> - возвращает значение java.lang.Number, которое будет частью элемента данных, добавляемого в серию при увеличении набора данных.

  • <volumeExpression> - числовое выражение, которое возвращает значение объема, используемое для текущего элемента данных. Используется только для свечных графиков.

  • <itemHyperlink> - устанавливает гиперссылки, связанные с элементами диаграммы.

Набор данных значения

Это специальная реализация набора данных диаграммы, которая содержит одно значение и используется для визуализации диаграмм измерителя и термометра. Значение собирается с помощью выражения <valueExpression>.

Графики

Другой распространенный элемент JRXML для всех типов диаграмм - это <plot> элемент. Это позволяет нам определять некоторые характеристики диаграммы, такие как ориентация и цвет фона. Графики различаются в зависимости от типа диаграммы.

Атрибут участка

В приведенной ниже таблице приведены атрибуты элемента <plot> -

Атрибут Описание Значения
цвет фона Этот атрибут определяет цвет фона диаграммы. Любое шестизначное шестнадцатеричное значение является допустимым значением для этого атрибута. Перед шестнадцатеричным значением должен стоять знак #.
ориентация Этот атрибут определяет ориентацию диаграммы. По горизонтали, вертикали Значение по умолчанию - «Вертикально»
фонАльфа Этот атрибут определяет прозрачность цвета фона диаграммы. Допустимые значения для этого атрибута включают любое десятичное число от 0 до 1 включительно. Чем выше число, тем менее прозрачным будет фон. Значение по умолчанию - «1».
передний планАльфа Этот атрибут определяет прозрачность цветов переднего плана диаграммы. Допустимые значения для этого атрибута включают любое десятичное число от 0 до 1 включительно. Чем выше число, тем менее прозрачным будет фон. Значение по умолчанию - «1».
labelRotation Этот атрибут позволяет вращать текстовые метки по оси x по часовой стрелке или против часовой стрелки. Этот атрибут применяется только к диаграммам, для которых ось x не является числовой или не отображает даты. Значение по умолчанию - «0,0».

Элемент <plot> имеет подэлемент <seriesColor> с атрибутами: seriesOrder и color . Этот элемент настраивает цвета для серий и их положение в цветовой последовательности.

Особые настройки для графиков

  • piePlot - Не имеет особых настроек

  • pie3DPlot- Содержит атрибут depthFactor , числовое значение в диапазоне от 0 до 1, представляющее глубину круговой диаграммы в процентах от высоты области графика.

  • barPlot - Можно показать или скрыть метки деления, метки деления или метки элементов, а также предоставить настройки для обеих осей.

  • bar3DPlot - Предоставляет те же настройки, что и barPlot, и создает трехмерный эффект с использованием атрибутов xOffset и yOffset.

  • linePlot - Можно показать или скрыть линии, соединяющие точки элементов, можно показать или скрыть формы, связанные с точками элементов, и предоставить настройки для обеих осей.

  • scatterPlot - Подобно linePlot, он может отображать или скрывать линии, соединяющие точки элементов, может отображать или скрывать формы, связанные с точками элементов, и предоставляет настройки для обеих осей.

  • areaPlot - Предоставляет настройки для обеих осей.

  • bubblePlot - Можно установить размеры пузыря, установив атрибут scaleType и предоставив настройки для обеих осей.

  • timeSeriesPlot - Можно показать или скрыть линии, соединяющие точки элементов, можно показать или скрыть формы, связанные с точками элементов, и предоставить настройки для обеих осей.

  • highLowPlot - Можно показать или скрыть открытые отметки, показать или скрыть закрытые отметки, а также предоставить настройки для обеих осей.

  • candlestickPlot - Можно показать или скрыть объем, и предоставляет настройки для обеих осей.

  • meterPlot - Содержит специальные настройки для формы циферблата, угла шкалы, единиц измерения, интервала деления, цвета циферблата, цвета стрелки, цвета отметки, шрифта отображения значений, цвета и образца формата, диапазона данных и интервалов счетчика.

  • thermometerPlot - Содержит определенные настройки для местоположения значения, цвета ртути, отображения / скрытия строк значений, шрифта отображения значения, цвета и шаблона формата, диапазона данных, низкого диапазона, среднего диапазона и высокого диапазона.

  • multiAxisChart - Содержит определенные настройки для оси, включенной в график.

Типы графиков

JasperReports предлагает встроенную поддержку нескольких типов диаграмм. Они перечислены ниже -

  • pieChart - Комбинация набора данных Pie и графика Pie.

  • pie3DChart - Группирует набор данных Pie и 3D-график Pie.

  • barChart - Базовая комбинация набора данных категории и гистограммы.

  • bar3DChart - Обертывает набор данных категории и трехмерный график.

  • xyBarChart - Поддерживает наборы данных периода времени, наборы данных временных рядов и наборы данных XY, а также использует гистограмму для визуализации оси и элементов.

  • stackedBarChart - Использует данные из набора данных категории и отображает его содержимое с помощью гистограммы.

  • stackedBar3DChart - Использует данные из набора данных категории и отображает его содержимое с помощью гистограммы 3D.

  • lineChart - Группирует набор данных категории и линейный график.

  • xyLineChart - Группирует набор данных XY и линейный график.

  • areaChart - Элементы из набора данных категории отображаются с использованием графика площади.

  • stackedAreaChart - Элементы из набора данных категории отображаются с использованием графика площади.

  • xyAreaChart - Использует данные из набора данных XY и отображает их на графике площади.

  • scatterChart - Обертывает набор данных XY диаграммой рассеяния.

  • bubbleChart - Объединяет набор данных XYZ с графиком пузырьков.

  • timeSeriesChart - Группирует набор данных временных рядов и график временных рядов.

  • highLowChart - Комбинация набора данных High-Low и графика High-Low.

  • candlestickChart - Использует данные из набора данных High-Low, но со специальным графиком Candlestick.

  • meterChart - Отображает одно значение из набора данных Value на циферблате с использованием параметров рендеринга из графика Meter.

  • thermometerChart - Отображает одиночное значение в наборе данных Value с использованием параметров визуализации из графика термометра.

  • multiAxisChart - Содержит несколько осей диапазона, каждая из которых имеет общую ось домена.

пример

Для демонстрации диаграмм напишем новый шаблон отчета (jasper_report_template.jrxml). Здесь мы добавим <barChart> в раздел <pageHeader> и <pieChart> в раздел <summary>. Мы будем отображать в диаграммах оценки, полученные по каждому предмету. Сохраните его в каталогC:\tools\jasperreports-5.0.1\test. Содержимое файла приведено ниже -

<?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 = "595" pageHeight = "860"
   columnWidth = "515" leftMargin = "40" rightMargin = "40"
   topMargin = "50" bottomMargin = "50">

   <field name = "subjectName" class = "java.lang.String"/>
   <field name = "marks" class = "java.lang.Integer"/>
   
   <variable name = "countNumber" class = "java.lang.Integer" calculation = "Count">
      <variableExpression>
         <![CDATA[Boolean.TRUE]]>
      </variableExpression>
   </variable>
   
   <background>
      <band splitType = "Stretch"/>
   </background>
   
   <title>
      <band height = "79" splitType = "Stretch"/>
   </title>
   
   <pageHeader>
      <band height = "200">
    
         <barChart>
            <chart evaluationTime = "Report">
               <reportElement x = "0" y = "0" width = "555" height = "200"/>
            
               <chartTitle>
                  <titleExpression>
                     <![CDATA["My First JR Bar Chart"]]>
                  </titleExpression>
               </chartTitle>
            </chart>
      
            <categoryDataset>
               <dataset incrementType = "None"/>
            
               <categorySeries>
                  <seriesExpression>
                     <![CDATA[$F{subjectName}]]>
                  </seriesExpression>
            
                  <categoryExpression>
                     <![CDATA[$F{subjectName}]]> </categoryExpression> <valueExpression> <![CDATA[$F{marks}]]>
                  </valueExpression>

               </categorySeries>
            </categoryDataset>
      
            <barPlot isShowTickMarks = "false">
               <plot/>
            </barPlot>
         </barChart>
      
      </band>
   </pageHeader>
   
   <columnHeader>
      <band height = "20" splitType = "Stretch"/>
   </columnHeader>
   
   <detail>
      <band height = "20" splitType = "Stretch"/>
   </detail>
   
   <columnFooter>
      <band height = "20" splitType = "Stretch"/>
   </columnFooter>
   
   <pageFooter>
      <band height = "20" splitType = "Stretch"/>
   </pageFooter>
   
   <summary>
      <band height = "400" splitType = "Stretch">
      
         <pieChart>
            <chart evaluationTime = "Report">
               <reportElement x = "135" y = "0" width = "270" height = "300"/>
            
               <chartTitle>
                  <titleExpression>
                     <![CDATA["My First JR Pie Chart"]]>
                  </titleExpression>
               </chartTitle>
            </chart>
         
            <pieDataset>
               <dataset incrementType = "None"/>
               
               <keyExpression>
                  <![CDATA[$F{subjectName}]]> </keyExpression> <valueExpression> <![CDATA[$F{marks}]]>
               </valueExpression>
            </pieDataset>
            
            <piePlot>
               <plot/>
               <itemLabel/>
            </piePlot>
         </pieChart>
      
      </band>
   </summary>
	
</jasperReport>

Подробности вышеупомянутого файла приведены ниже -

  • Элемент JRXML, используемый для создания гистограммы, находится </barChart> в <pageHeader>. Он содержит подэлемент </chart>, который содержит подэлемент <reportElement>, определяющий размеры и положение диаграммы.

  • Элемент <dataset> на линейчатой ​​диаграмме должен быть заключен между элементами <categoryDataset> и </categoryDataset> JRXML.

  • <categoryDataset> должен содержать элемент <categorySeries>. Этот элемент определяет, какой элемент данных будут представлять полосы (в данном примере - имена субъектов).

  • <categoryDataset> также должен содержать элемент, который определяет, как данные будут разделены на категории для сравнения. Здесь данные разделены именами субъектов.

  • Элемент <valueExpression> определяет, какое выражение используется для определения значения каждого столбца на диаграмме. Здесь мы используем «метки».

  • Для круговой диаграммы мы использовали элемент <pieChart> в разделе <summary>. Он содержит подэлемент </chart>.

  • Подэлемент содержит выражение отчета, указывающее, что использовать в качестве ключа на диаграмме. Здесь мы использовали subjectName.

  • Подэлемент содержит выражение, используемое для вычисления значения ключа. Здесь мы использовали марки.

Java-коды для заполнения отчетов остались без изменений. Содержимое файлаC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource = new 
         JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();

      try {
         JasperFillManager.fillReportToFile( sourceFileName,
            parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Поскольку мы будем отображать оценки, полученные по каждому предмету, POJO необходимо изменить. ФайлC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java содержание приведено ниже -

package com.tutorialspoint;

public class DataBean {
   private String subjectName;
   private Integer marks;

   public String getSubjectName() {
      return subjectName;
   }

   public void setSubjectName(String subjectName) {
      this.subjectName = subjectName;
   }

   public Integer getMarks() {
      return marks;
   }

   public void setMarks(Integer marks) {
      this.marks = marks;
   }

}

Даже содержимое файла C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java необходимо обновить, как указано ниже -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("English", 58));
      dataBeanList.add(produce("SocialStudies", 68));
      dataBeanList.add(produce("Maths", 38));
      dataBeanList.add(produce("Hindi", 88));
      dataBeanList.add(produce("Scince", 78));
      
      return dataBeanList;
   }

   /*
    * This method returns a DataBean object, with subjectName ,
    * and marks set in it.
    */
   private DataBean produce(String subjectName, Integer marks) {
      DataBean dataBean = new DataBean();

      dataBean.setSubjectName(subjectName);
      dataBean.setMarks(marks);

      return dataBean;
   }
}

Генерация отчетов

Затем давайте скомпилируем и выполним указанные выше файлы, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport является целью по умолчанию) следующим образом:

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, defaulting to bu
   [javac] Compiling 3 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 19 minutes 45 seconds

В результате вышеуказанной компиляции открывается окно JasperViewer, как на экране ниже -

Здесь мы видим, что столбчатая диаграмма создается в заголовке страницы, а круговая диаграмма создается в разделах сводки.

Отчеты кросс-таблиц (кросс-таблицы) - это отчеты, содержащие таблицы, которые упорядочивают данные по строкам и столбцам в табличной форме. Объект кросс-таблицы используется для вставки отчета кросс-таблицы в основной отчет. Перекрестные таблицы могут использоваться с любым уровнем данных (номинальным, порядковым, интервалом или соотношением) и обычно отображают сводные данные, содержащиеся в переменных отчета, в форме динамической таблицы. Переменные используются для отображения совокупных данных, таких как суммы, числа, средние значения.

Свойства кросс-таблицы

Элемент JRXML <crosstab> используется для вставки кросс-таблицы в отчет.

Атрибут

Ниже приведен список атрибутов <crosstab> элемент -

  • isRepeatColumnHeaders- Указывает, следует ли перепечатывать заголовки столбцов после разрыва страницы. Значение по умолчанию - истина .

  • isRepeatRowHeaders- Указывает, следует ли повторно печатать заголовки строк после разрыва столбца кросс-таблицы. Значение по умолчанию - истина .

  • columnBreakOffset- Когда происходит разрыв столбца, указывает количество вертикального пространства, измеренное в пикселях, перед тем, как следующий фрагмент кросс-таблицы будет помещен под предыдущим на той же странице. Значение по умолчанию - 10.

  • runDirection- Указывает, следует ли заполнять данные кросс-таблицы слева направо (LTR) или справа налево (RTL). Значение по умолчанию - LTR.

  • ignoreWidth- Указывает, будет ли кросс-таблица выходить за пределы исходного предела ширины кросс-таблицы и не создавать ли разрывы столбцов. В противном случае он остановит отображение столбцов в пределах ширины кросс-таблицы и продолжит отображение оставшихся столбцов только после того, как все строки начнут отображаться. Значение по умолчанию - false .

Подэлементы

Элемент <crosstab> имеет следующие подэлементы -

  • <reportElement>- Этот элемент определяет положение, ширину и высоту кросс-таблицы внутри ее. Атрибуты этого элемента включают все стандартные атрибуты <reportElement>.

  • <crosstabParameter>- Этот элемент используется для доступа к переменным и параметрам отчета из кросс-таблицы. Атрибуты для этого элемента включают -

    • name - определяет имя параметра.

    • class - указывает класс параметра.

  • <parametersMapExpression>- Этот элемент используется для передачи переменной отчета или параметра, содержащего экземпляр java.util.Map , в качестве набора параметров для кросс-таблицы. Этот элемент не содержит атрибутов.

  • <crosstabDataset>- Этот элемент определяет набор данных, который будет использоваться для заполнения кросс-таблицы (подробное объяснение см. В следующем разделе). Атрибуты для этого элемента включают -

    • isDataPreSorted - указывает, предварительно отсортированы ли данные в наборе данных. Значение по умолчанию - false .

  • <crosstabHeaderCell>- Этот элемент определяет содержимое области в верхнем левом углу кросс-таблицы, где встречаются заголовки столбцов и строк. Размер этой ячейки рассчитывается автоматически на основе заданных значений ширины и высоты строки и столбца.

  • <rowGroup>- Этот элемент определяет группу, используемую для разделения данных на строки. Атрибуты для этого элемента включают -

    • name - определяет имя группы строк.

    • width - определяет ширину группы строк.

    • headerPosition - определяет положение содержимого заголовка (сверху, по центру , снизу, растянуть).

    • totalPosition - определяет положение всего столбца (начало, конец, нет).

    Этот элемент содержит следующие подэлементы -

    • <bucket>

    • <crosstabRowHeader>

    • <crosstabTotalRowHeader>

  • <columnGroup>- Этот элемент определяет группу, используемую для разделения данных на столбцы. Атрибуты для этого элемента включают -

    • name - определяет имя группы столбцов.

    • height - определяет высоту заголовка группы столбцов.

    • headerPosition - определяет положение содержимого заголовка ( справа, слева, по центру, растянуть ).

    • totalPosition - определяет положение всего столбца ( начало, конец, нет ).

    Этот элемент содержит следующие подэлементы -

    • <bucket>

    • <crosstabColumnHeader>

    • <crosstabTotalColumnHeader>

  • <measure>- Этот элемент определяет расчет, который будет выполняться по строкам и столбцам. Атрибуты для этого элемента включают -

    • name - определяет имя меры.

    • class - указывает класс меры.

    • вычисление - указывает, что вычисление должно выполняться между значениями ячеек кросс-таблицы. Его значения могут быть любыми из этих: Nothing, Count, DistinctCount, Sum, Average, Lowest, Highest, StandardDeviation, Variance и First . Значение по умолчаниюNothing.

  • <crosstabCell>- Этот элемент определяет, как будут располагаться данные в ячейках без заголовка. Атрибуты для этого элемента включают -

    • columnTotalGroup - указывает группу, которая будет использоваться для расчета итоговой суммы столбца.

    • height - определяет высоту ячейки.

    • rowTotalGroup - указывает группу, которая будет использоваться для расчета итоговой суммы строки.

    • width - определяет ширину ячейки.

  • <whenNoDataCell>- Этот элемент определяет, что отображать в пустой ячейке кросс-таблицы. Этот элемент не содержит атрибутов.

Группировка данных в кросс-таблице

Механизм вычислений кросс-таблиц агрегирует данные, просматривая связанные записи набора данных. Чтобы агрегировать данные, их нужно сначала сгруппировать. В кросс-таблице строки и столбцы основаны на определенных элементах группы, называемыхbuckets. Определение корзины должно содержать -

  • bucketExpression - выражение, которое нужно оценить для получения элементов группы данных.

  • ComparatorExpression - требуется в случае, если естественный порядок значений не лучший выбор.

  • orderByExpression - указывает значение, используемое для сортировки данных.

Группы строк и столбцов (определенные выше) в кросс-таблице зависят от buckets.

Встроенная кросс-таблица итоговых переменных

Ниже приведен список текущего значения меры и итогов различных уровней, соответствующих ячейке, можно получить через переменные, названные в соответствии со следующей схемой -

  • Текущее значение вычисления меры сохраняется в переменной, имя которой совпадает с именем меры.

  • <Измерение> _ <Группа столбцов> _ALL - выдает общую сумму для всех записей в группе столбцов из одной строки.

  • <Measure> _ <Row Group> _ALL - выдает общую сумму для всех записей в группе строк из одного столбца.

  • <Измерение> _ <Группа строк> _ <Группа столбцов> _ALL - это дает объединенную сумму, соответствующую всем записям в группах строк и столбцов.

пример

Чтобы продемонстрировать кросс-таблицы, напишем новый шаблон отчета (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">

   <parameter name = "ReportTitle" class = "java.lang.String"/>
   <parameter name = "Author" class = "java.lang.String"/>
   
   <field name = "name" class = "java.lang.String"/>
   <field name = "country" class = "java.lang.String"/>
   
   <title>
      <band height = "70">
         
         <line>
            <reportElement x = "0" y = "0" width = "515" height = "1"/>
         </line>
         
         <textField isBlankWhenNull = "true" bookmarkLevel = "1">
            <reportElement x = "0" y = "10" width = "515" height = "30"/>
            
            <textElement textAlignment = "Center">
               <font size = "22"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{ReportTitle}]]>
            </textFieldExpression>
            
            <anchorNameExpression>
               <![CDATA["Title"]]>
            </anchorNameExpression>
         </textField>
         
         <textField isBlankWhenNull = "true">
            <reportElement  x = "0" y = "40" width = "515" height = "20"/>
            
            <textElement textAlignment = "Center">
               <font size = "10"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{Author}]]> </textFieldExpression> </textField> </band> </title> <summary> <band height = "60"> <crosstab> <reportElement width = "782" y = "0" x = "0" height = "60"/> <rowGroup name = "nameGroup" width = "100"> <bucket> <bucketExpression class = "java.lang.String"> <![CDATA[$F{name}]]>
               </bucketExpression>
            </bucket>
            
            <crosstabRowHeader>
            
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  
                  <textField>
                     <reportElement width = "100" y = "0" x = "0" height = "20"/>
                     <textElement textAlignment = "Right" 
                        verticalAlignment = "Middle"/>
                     
                     <textFieldExpression>
                        <![CDATA[$V{nameGroup}]]> </textFieldExpression> </textField> </cellContents> </crosstabRowHeader> </rowGroup> <columnGroup name = "countryGroup" height = "20"> <bucket> <bucketExpression class = "java.lang.String"> $F{country}
               </bucketExpression>
            </bucket>
            
            <crosstabColumnHeader>
               <cellContents>
                  <box border = "Thin" borderColor = "black"/>
                  <textField isStretchWithOverflow = "true">
                     <reportElement width = "60" y = "0" x = "0" height = "20"/>
                     <textElement verticalAlignment = "Bottom"/>
                     <textFieldExpression>
                        <![CDATA[$V{countryGroup}]]> </textFieldExpression> </textField> </cellContents> </crosstabColumnHeader> </columnGroup> <measure name = "tailNumCount" class = "java.lang.Integer" calculation = "Count"> <measureExpression>$F{country}</measureExpression>
         </measure>
         
         <crosstabCell height = "20" width = "60">
            <cellContents backcolor = "#FFFFFF">
               <box borderColor = "black" border = "Thin"/>
               <textField>
                  <reportElement x = "5" y = "0" width = "55" height = "20"/>
                  <textElement textAlignment = "Left" 
                     verticalAlignment = "Bottom"/>
                  <textFieldExpression class = "java.lang.Integer">
                      $V{tailNumCount}
                  </textFieldExpression>
               </textField>
            </cellContents>
         </crosstabCell>
      
      </crosstab>
      
      </band>
   </summary>
	
</jasperReport>

Подробности вышеупомянутого файла следующие -

  • Перекрестная таблица определяется элементом <crosstab>.

  • Элемент <rowGroup> определяет группу для разделения данных на строки. Здесь каждая строка будет отображать данные для другого имени.

  • Элементы <bucket> и <bucketExpression> определяют, какое выражение отчета использовать в качестве разделителя группы для <rowGroup>. Здесь мы использовали поле имени в качестве разделителя, чтобы разделить строки по имени.

  • Элемент <crosstabRowHeader> определяет выражение, которое будет использоваться в качестве заголовка строки. Он содержит единственный подэлемент, а именно <cellContents>, который действует как внутренняя полоса внутри перекрестной таблицы. Вместо определения имени переменной для текстового поля внутри <crosstabRowHeader> мы присвоили имя <rowGroup> (через его атрибут name), поэтому он создает неявную переменную. Элемент <crosstabRowHeader> определяет содержимое ячейки заголовка для всей строки. Он принимает единственный элемент <cellContents> как единственный подэлемент.

  • Элемент <columnGroup>, а также его подэлементы аналогичны элементу <rowGroup>, за исключением того, что он влияет на столбцы, а не на строки.

  • Элемент <measure> определяет вычисления, которые будут выполняться по строкам и столбцам. Расчет атрибут установлен в Count .

  • Элемент <crosstabCell> определяет, как будут располагаться данные в ячейках без заголовка. Этот элемент также содержит единственный элемент <crosstabCell> в качестве своего единственного подэлемента.

Java-коды для заполнения отчетов остались без изменений. Содержимое файлаC:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\JasperReportFill.java приведены ниже -

package com.tutorialspoint;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class JasperReportFill {
   @SuppressWarnings("unchecked")
   public static void main(String[] args) {
      String sourceFileName = 
         "C://tools/jasperreports-5.0.1/test/jasper_report_template.jasper";

      DataBeanList DataBeanList = new DataBeanList();
      ArrayList<DataBean> dataList = DataBeanList.getDataBeanList();

      JRBeanCollectionDataSource beanColDataSource =
      new JRBeanCollectionDataSource(dataList);

      Map parameters = new HashMap();
      /**
       * Passing ReportTitle and Author as parameters
       */
      parameters.put("ReportTitle", "List of Contacts");
      parameters.put("Author", "Prepared By Manisha");

      try {
         JasperFillManager.fillReportToFile(
         sourceFileName, parameters, beanColDataSource);
      } catch (JRException e) {
         e.printStackTrace();
      }
   }
}

Содержимое файла POJO C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBean.java следующие -

package com.tutorialspoint;

public class DataBean {
   private String name;
   private String country;

   public String getName() {
      return name;
   }

   public void setName(String name) {
      this.name = name;
   }

   public String getCountry() {
      return country;
   }

   public void setCountry(String country) {
      this.country = country;
   }
}

Содержимое файла C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\DataBeanList.java следующие -

package com.tutorialspoint;

import java.util.ArrayList;

public class DataBeanList {
   public ArrayList<DataBean> getDataBeanList() {
      ArrayList<DataBean> dataBeanList = new ArrayList<DataBean>();

      dataBeanList.add(produce("Manisha", "India"));
      dataBeanList.add(produce("Dennis Ritchie", "USA"));
      dataBeanList.add(produce("V.Anand", "India"));
      dataBeanList.add(produce("Shrinath", "California"));

      return dataBeanList;
   }

   /**
    * This method returns a DataBean object,
    * with name and country set in it.
    */
   private DataBean produce(String name, String country) {
      DataBean dataBean = new DataBean();
      dataBean.setName(name);
      dataBean.setCountry(country);
      
      return dataBean;
   }
}

Генерация отчетов

Затем давайте скомпилируем и выполним указанные выше файлы, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFill (viewFullReport является целью по умолчанию) следующим образом:

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

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, defaulting to
   [javac] Compiling 3 source files 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.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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFill
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger (
   net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 20 minutes 53 seconds

В результате вышеуказанной компиляции открывается окно JasperViewer, как показано на экране, приведенном ниже -

Здесь мы видим, что каждая страна и название указаны в таблице.

Иногда нам нужны отчеты на разных языках. Написание одного и того же отчета для разных языков подразумевает много лишней работы. Только фрагменты текста, отличающиеся от языка к языку, должны быть написаны отдельно и загружены в текстовые элементы во время выполнения, в зависимости от настроек локали. Это цель интернационализации отчета. После написания интернационализированных отчетов их можно использовать везде.

В следующих шагах мы перечислили, как создать отчет на разных языках, а также некоторые другие функции интернационализации отчета.

  • Свяжите пакет ресурсов java.util.ResourceBundle с шаблоном отчета. Есть два способа связать объект java.util.ResourceBundle с шаблоном отчета.

    • Во время разработки, задав для атрибута resourceBundle объекта шаблона отчета базовое имя целевого пакета ресурсов.

    • Связывание динамическое / время выполнения может быть выполнено путем предоставления объекта java.util.ResourceBundle в качестве значения для параметра REPORT_RESOURCE_BUNDLE во время заполнения отчета.

    • Если отчет должен быть создан в языковом стандарте, отличном от текущего, можно использовать встроенный параметр REPORT_LOCALE, чтобы указать языковой стандарт времени выполнения при заполнении отчета.

  • Чтобы облегчить интернационализацию отчета, специальный синтаксис $R{}доступен внутри выражений отчета для ссылки на ресурсы java.lang.String, размещенные внутри объекта java.util.ResourceBundle, связанного с отчетом. В$R{} символьный синтаксис извлекает ресурс, зависящий от локали, из пакета ресурсов на основе ключа, который должен быть помещен в скобки -

<textFieldExpression>
   $R{report.title}
</textFieldExpression>

В приведенном выше текстовом поле отображается заголовок отчета путем извлечения значения String из пакета ресурсов, связанного с шаблоном отчета, на основе языкового стандарта, используемого во время выполнения, и ключа report.title .

  • Для форматирования сообщений на разных языках в зависимости от языкового стандарта отчета существует встроенный метод внутри отчетов net.sf.jasperreports.engine.fill.JRCalculator . Этот метод предлагает функции, аналогичные классу java.text.MessageFormat . Этот метод msg () имеет три удобные сигнатуры, которые позволяют вам использовать в сообщениях до трех параметров сообщения.

  • Встроенный метод str () (эквивалент синтаксиса $ R {} внутри выражений отчета), который предоставляет доступ к содержимому пакета ресурсов в зависимости от языкового стандарта отчета.

  • Для форматирования даты и времени можно использовать встроенный параметр REPORT_TIME_ZONE, чтобы обеспечить правильное преобразование времени.

  • В сгенерированном выводе библиотека хранит информацию о направлении движения текста, чтобы документы, созданные на языках с написанием справа налево (например, арабском и иврите), могли отображаться правильно.

  • Если приложение полагается на встроенную программу просмотра Swing для отображения сгенерированных отчетов, то его необходимо интернационализировать, адаптируя всплывающие подсказки кнопок или другой отображаемый текст. Это очень легко сделать, поскольку средство просмотра полагается на предопределенный пакет ресурсов для извлечения информации, зависящей от локали. Базовое имя для этого пакета ресурсов - net.sf.jasperreports.view.viewer.

пример

Чтобы продемонстрировать интернационализацию, напишем новый шаблон отчета (jasper_report_template.jrxml). Содержание 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" resourceBundle = "localizationdemo">
   
   <title>
      <band height = "552">
         
         <textField>
            <reportElement positionType = "Float" x = "150" y = "20" 
               width = "400" height = "50"/>
            
            <textElement>
               <font size = "24"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$P{REPORT_LOCALE}.getDisplayName ($P{REPORT_LOCALE})]]>
            </textFieldExpression>
         </textField>

         <textField isStretchWithOverflow = "true" isBlankWhenNull = "true">
            <reportElement positionType = "Float" x = "20" y = "125" 
               width = "530" height = "20"/>
            
            <textElement textAlignment = "Justified">
               <font size = "14"/>
            </textElement>
            
            <textFieldExpression class = "java.lang.String">
               <![CDATA[$R{localization.text1}]]>
            </textFieldExpression>
         
         </textField>
      
      </band>
   </title>

</jasperReport>

В указанном файле, то ResourceBundle атрибут <jasperReport> элемент сообщает JasperReports , где можно получить локализованные строки для использования в отчете. Нам нужно создать файл свойств с корневым именем, соответствующим значению атрибута. Этот файл должен существовать в любом месте CLASSPATH при заполнении отчета. В этом примере файл свойствlocalizationdemo.properties сохраняется в каталоге C:\tools\jasperreports-5.0.1\test. Содержимое этого файла выглядит следующим образом -

localization.text1 = This is English text.

Чтобы использовать другой языковой стандарт, имя файла должно быть localizationdemo [locale] .properties. Здесь мы напишем файл для испанского языка. Сохраните этот файл как -C:\tools\jasperreports-5.0.1\test\localizationdemo_es.properties. Содержимое этого файла следующее -

localization.text1 = Este texto es en Español.

Синтаксис для получения значения свойств resourceBundle: $ R {key}.

Чтобы JasperReports знал, какую локаль мы хотим использовать, нам нужно присвоить значение встроенному параметру. Имя этого параметра определяется как константа REPORT_LOCALE, и эта константа определена в классе net.sf.jasperreports.engine.JRParameter . Значение константы должно быть экземпляром java.util.Locale . Эта логика включена в код Java для заполнения и создания отчета. Сохраним этот файлJasperReportFillI18.javaв каталог C: \ tools \ jasperreports-5.0.1 \ test \ src \ com \ tutorialspoint. Содержимое файла выглядит следующим образом -

package com.tutorialspoint;

import java.util.HashMap;
import java.util.Locale;

import net.sf.jasperreports.engine.JREmptyDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperFillManager;

public class JasperReportFillI18 {

   public static void main(String[] args) {
      String sourceFileName = "C://tools/jasperreports-5.0.1/test/"
         + "jasper_report_template.jasper";
      HashMap parameterMap = new HashMap();
      if (args.length > 0) {
         parameterMap.put(JRParameter.REPORT_LOCALE, new Locale(args[0]));
      }
      try {
         JasperFillManager.fillReportToFile(sourceFileName, null, 
            new JREmptyDataSource());
      } catch (JRException e) {
         // TODO Auto-generated catch block
         e.printStackTrace();
      }

   }
}

Генерация отчетов

Мы скомпилируем и выполним указанный выше файл, используя наш обычный процесс сборки ANT. Содержимое файла build.xml (сохраненного в каталоге C: \ tools \ jasperreports-5.0.1 \ test) показано ниже.

Файл импорта - baseBuild.xml взят из главы « Настройка среды» и должен быть помещен в тот же каталог, что и 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>

Далее, давайте откроем окно командной строки и перейдем в каталог, в котором находится build.xml. Наконец, выполните командуant -Dmain-class=com.tutorialspoint.JasperReportFillI18 (viewFullReport является целью по умолчанию) следующим образом:

C:\tools\jasperreports-5.0.1\test>ant  -Dmain-class=com.tutorialspoint.JasperReportFillI18
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, defaulting to
   [javac] Compiling 1 source file to C:\tools\jasperreports-5.0.1\test\classes
   [javac] Note: C:\tools\jasperreports-5.0.1\test\src\com\tutorialspoint\
      JasperReportFillI18.java
   uses unchecked or u
   [javac] Note: Recompile with -Xlint:unchecked for details.

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.

run:
   [echo] Runnin class : com.tutorialspoint.JasperReportFillI18
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

viewFillReport:
   [java] log4j:WARN No appenders could be found for logger
   (net.sf.jasperreports.extensions.ExtensionsEnvironment).
   [java] log4j:WARN Please initialize the log4j system properly.

BUILD SUCCESSFUL
Total time: 3 minutes 28 seconds

В результате вышеуказанной компиляции открывается окно JasperViewer, как показано на экране, приведенном ниже -