Мы обсудили структуру простого шаблона отчета в главе « Начало работы» . Аналогичным образом JasperReports структурирует шаблон отчета в несколько разделов. Разделы — это части отчета, которые имеют указанную высоту и могут содержать объекты отчета, такие как линии, прямоугольники, изображения или текстовые поля.
Механизм отчетов просматривает виртуальные записи предоставленного источника данных отчета во время заполнения отчета. В зависимости от поведения, определенного в каждом разделе, механизм обрабатывает каждый раздел отчета, когда это необходимо. Например, подробный раздел отображается для каждой записи в источнике данных. Когда возникают разрывы страниц, верхний и нижний колонтитулы страницы отображаются по мере необходимости.
В JasperReports разделы терминологии и отчета также называются полосами отчета . Разделы состоят из одной или нескольких полос. Эти разделы заполняются повторно во время создания отчета и готовят окончательный документ.
Основные разделы
Шаблон отчета в 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 |
заглавие Этот раздел появляется только один раз в начале отчета. |
2 |
Заголовок страницы Этот раздел появляется в начале каждой страницы в созданном документе. |
3 |
Заголовок столбца Этот раздел появляется в начале каждого столбца в сгенерированном документе. Если в отчете определен только один столбец, то разделы верхнего и нижнего колонтитулов игнорируются. |
4 |
Заголовок группы Этот раздел представлен группой отчетов (глава Группы ). Каждый раз, когда выражение группировки изменяет свое значение, раздел заголовка группы печатается над разделом сведений. В случае, если определено более одной группы, заголовок группы печатается в порядке определения группы. |
5 |
подробность Этот раздел повторяется для каждой строки данных, предоставленной источником данных отчета. Детальный раздел может быть сделан из нескольких полос. |
6 |
Нижний колонтитул группы Этот раздел представлен группой отчетов (глава Группы ). Раздел нижнего колонтитула группы печатается под разделом сведений до изменения значения выражения группировки. Нижний колонтитул группы всегда печатается для последней строки данных в источнике данных. В случае, если определено более одной группы, нижний колонтитул группы печатается в обратном порядке определения группы. |
7 |
Нижний колонтитул Этот раздел отображается внизу каждого столбца. Если количество столбцов в отчете равно 1, то разделы верхнего и нижнего колонтитула игнорируются. |
8 |
Нижний колонтитул страницы Этот раздел отображается внизу каждой страницы. |
9 |
Нижний колонтитул последней страницы Этот раздел заменяет обычный нижний колонтитул на последней странице отчета. В случае, если раздел резюме также присутствует, то это может быть не самая последняя страница документа. Этот раздел иногда полезен, когда сводная информация должна отображаться внизу последней страницы. |
10 |
Резюме Этот раздел появляется только один раз в конце отчета. |
11 |
Нет данных Этот раздел печатается, когда для свойства отчета « Когда нет данных» установлено значение « Нет данных» . Если в шаблоне отчета определен раздел <noData> и если источник данных пуст, то во время заполнения будет учитываться только раздел <noData>, и его содержимое будет выводить отчет. |
12 |
Фон Фоновый раздел отображается на каждой странице и не может перейти на следующую страницу. Элементы, размещенные в этом разделе, оцениваются во время инициализации страницы и отображаются в фоновом режиме. Все остальные объекты страницы отображаются поверх фоновых объектов. Этот раздел полезен для создания водяных знаков на странице. |
заглавие
Этот раздел появляется только один раз в начале отчета.
Заголовок страницы
Этот раздел появляется в начале каждой страницы в созданном документе.
Заголовок столбца
Этот раздел появляется в начале каждого столбца в сгенерированном документе. Если в отчете определен только один столбец, то разделы верхнего и нижнего колонтитулов игнорируются.
Заголовок группы
Этот раздел представлен группой отчетов (глава Группы ). Каждый раз, когда выражение группировки изменяет свое значение, раздел заголовка группы печатается над разделом сведений. В случае, если определено более одной группы, заголовок группы печатается в порядке определения группы.
подробность
Этот раздел повторяется для каждой строки данных, предоставленной источником данных отчета. Детальный раздел может быть сделан из нескольких полос.
Нижний колонтитул группы
Этот раздел представлен группой отчетов (глава Группы ). Раздел нижнего колонтитула группы печатается под разделом сведений до изменения значения выражения группировки. Нижний колонтитул группы всегда печатается для последней строки данных в источнике данных. В случае, если определено более одной группы, нижний колонтитул группы печатается в обратном порядке определения группы.
Нижний колонтитул
Этот раздел отображается внизу каждого столбца. Если количество столбцов в отчете равно 1, то разделы верхнего и нижнего колонтитула игнорируются.
Нижний колонтитул страницы
Этот раздел отображается внизу каждой страницы.
Нижний колонтитул последней страницы
Этот раздел заменяет обычный нижний колонтитул на последней странице отчета. В случае, если раздел резюме также присутствует, то это может быть не самая последняя страница документа. Этот раздел иногда полезен, когда сводная информация должна отображаться внизу последней страницы.
Резюме
Этот раздел появляется только один раз в конце отчета.
Нет данных
Этот раздел печатается, когда для свойства отчета « Когда нет данных» установлено значение « Нет данных» . Если в шаблоне отчета определен раздел <noData> и если источник данных пуст, то во время заполнения будет учитываться только раздел <noData>, и его содержимое будет выводить отчет.
Фон
Фоновый раздел отображается на каждой странице и не может перейти на следующую страницу. Элементы, размещенные в этом разделе, оцениваются во время инициализации страницы и отображаются в фоновом режиме. Все остальные объекты страницы отображаются поверх фоновых объектов. Этот раздел полезен для создания водяных знаков на странице.
Раздел, элементы и связь атрибутов
На следующей диаграмме показана взаимосвязь элементов и атрибутов в разделе отчета.
Элементы раздела
Все вышеупомянутые разделы отчета не являются обязательными. Но у любого шаблона отчета будет хотя бы один такой раздел. Каждый из этих разделов содержит один элемент < band > в качестве единственного подэлемента. < Band > может содержать ноль или более следующих подэлементов —
<line>, <rectangle>, <ellipse>, <image>, <staticText>, <textField>, <subReport> или <elementGroup>
Каждый из этих элементов должен содержать один < reportElement > в качестве первого элемента (кроме elementGroup). < ReportElement > определяет способ размещения данных для этого конкретного элемента. В отличие от переменных и параметров, элементы отчета не обязательно должны иметь имя, потому что обычно вам не нужно получать какой-либо отдельный элемент внутри шаблона отчета.
В таблице ниже приведены атрибуты < reportElement > —
атрибут | Описание | Допустимые значения |
---|---|---|
Икс | Определяет координату x элемента band. | Целочисленное значение, обозначающее координату x элемента в пикселях. Этот атрибут обязателен. |
Y | Определяет координату y элемента band. | Целочисленное значение, указывающее координату y элемента в пикселях. Этот атрибут обязателен. |
ширина | Определяет ширину элемента полосы. | Целочисленное значение, указывающее ширину элемента в пикселях. Этот атрибут обязателен. |
рост | Определяет высоту элемента группы. | Целочисленное значение, обозначающее высоту элемента в пикселях. Этот атрибут обязателен. |
ключ | Уникальный идентификатор элемента группы. | Уникальное строковое значение. |
stretchType | Определяет, как растягивается элемент, когда растягивается содержащаяся полоса |
NoStretch (по умолчанию) — элемент не растягивается. RelativeToTallestObject — элемент растянется, чтобы вместить самый высокий объект в его группе. RelativeToBand — элемент будет растягиваться, чтобы соответствовать высоте полосы. |
positionType | Определяет позицию элемента, когда полоса растягивается. |
Float — элемент будет перемещаться в зависимости от размера окружающих элементов. FixRelativeToTop (по умолчанию) — элемент будет сохранять фиксированную позицию относительно вершины полосы. FixRelativeToBottom — Элемент будет сохранять фиксированное положение относительно основания группы. |
isPrintRepeatedValues | Указывает, будут ли напечатаны повторяющиеся значения. |
true (по умолчанию) — повторные значения будут напечатаны. false — повторяющиеся значения не будут напечатаны. |
Режим | Определяет фоновый режим элемента | Непрозрачный, прозрачный |
isRemoveLineWhenBlank | Указывает, должен ли элемент быть удален, когда он пуст, и нет других элементов в том же горизонтальном пространстве. | правда, ложь |
isPrintInFirstWholeBand | Указывает, должен ли элемент печататься во всей полосе, то есть полосе, которая не разделена между страницами отчета или столбцами. | правда, ложь |
isPrintWhenDetailOverFlows | Указывает, будет ли элемент печататься при переполнении полосы на новую страницу или столбец. | правда, ложь |
printWhenGroupChanges | Указывает, что элемент будет напечатан при изменении указанной группы. | Строковое значение. |
ForeColor | Определяет цвет переднего плана элемента. | Либо шестнадцатеричное значение RGB с предшествующим символом #, либо одно из следующих предварительно определенных значений: черный, синий, голубой, темно-серый, серый, зеленый, светло-серый, пурпурный, оранжевый, розовый, красный, желтый, белый. |
BackColor | Определяет цвет фона элемента. | То же, что и допустимые значения для forecolor |
NoStretch (по умолчанию) — элемент не растягивается.
RelativeToTallestObject — элемент растянется, чтобы вместить самый высокий объект в его группе.
RelativeToBand — элемент будет растягиваться, чтобы соответствовать высоте полосы.
Float — элемент будет перемещаться в зависимости от размера окружающих элементов.
FixRelativeToTop (по умолчанию) — элемент будет сохранять фиксированную позицию относительно вершины полосы.
FixRelativeToBottom — Элемент будет сохранять фиксированное положение относительно основания группы.
true (по умолчанию) — повторные значения будут напечатаны.
false — повторяющиеся значения не будут напечатаны.
Атрибуты раздела
Ниже приведены атрибуты раздела отчета.
Рост
Высота раздела определяет высоту в пикселях для этого конкретного раздела и очень важна в общем дизайне отчета.
Распечатать при выражении
Булево выражение, определяющее, следует ли печатать раздел или нет.
Разрешено разделение
Флаг, указывающий, разрешено ли разделение раздела, если он не помещается на текущей странице. Если true, раздел будет перенесен на следующую страницу. Обратите внимание, что в случае, если раздел не помещается на следующей странице, он будет разделен независимо от значения флага. splitType может принимать следующие значения —
-
splitType = «Stretch:» Разбивает растянутое содержимое. Если раздел растягивается на текущей странице (если доступное пространство меньше заявленной высоты), область, добавленная к исходной высоте, может быть разделена на следующую страницу.
-
splitType = «Prevent:» Запретить разделение с первой попытки. Если раздел не помещается на следующей странице, разделение происходит нормально, поскольку предотвращение разделения полосы действует только при первой попытке разделения.
-
splitType = «Немедленно:» Разделить немедленно. Полоске разрешено делиться где угодно, кроме как выше, ее верхний элемент.
splitType = «Stretch:» Разбивает растянутое содержимое. Если раздел растягивается на текущей странице (если доступное пространство меньше заявленной высоты), область, добавленная к исходной высоте, может быть разделена на следующую страницу.
splitType = «Prevent:» Запретить разделение с первой попытки. Если раздел не помещается на следующей странице, разделение происходит нормально, поскольку предотвращение разделения полосы действует только при первой попытке разделения.
splitType = «Немедленно:» Разделить немедленно. Полоске разрешено делиться где угодно, кроме как выше, ее верхний элемент.
пример
Чтобы продемонстрировать каждый раздел, напишем шаблон отчета (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> будут отображаться только в отчете, если в нем более одного столбца.