Разделы отчета
Мы обсудили структуру простого шаблона отчета в главе « Начало работы» . Аналогичным образом 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> может содержать ноль или более следующих подэлементов -
<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> или <elementGroup>
Каждый из этих элементов должен содержать единственный <reportElement> в качестве первого элемента (кроме elementGroup). А <reportElement> определяет, как данные размещаются для этого конкретного элемента. В отличие от переменных и параметров, элементы отчета не обязательно должны иметь имя, потому что обычно вам не нужно получать какой-либо отдельный элемент внутри шаблона отчета.
В таблице ниже приведены атрибуты <reportElement> -
Атрибут | Описание | Действительные значения |
---|---|---|
Икс | Задает координату x элемента полосы. | Целочисленное значение, указывающее координату x элемента в пикселях. Этот атрибут обязателен. |
у | Задает координату 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 = "Предотвратить:" Предотвратить разделение с первой попытки. Если раздел не помещается на следующей странице, разделение происходит нормально, поскольку предотвращение разделения полосы эффективно только при первой попытке разделения.
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> будут отображаться в отчете, только если в нем более одного столбца.