4.2.5. Шаблон JasperReports

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

Создавайте шаблоны JRXML, как используя специальные утилиты JasperReports (такие, как Jaspersoft Studio), так и в текстовом редакторе. Каждой полосе отчёта, указанной в его структуре, должен соответствовать свой элемент band в файле шаблона, который, в свою очередь, должен быть помещен в одну из стандартных секций отчёта JasperReports (в терминологии JasperReports эти секции также называются bands): title, pageHeader, columnHeader, detail, и т.д.

Из данных со всех полос отчёта генератор формирует один источник данных: JRBandDataDataSource, содержащий данные в виде дерева с корневой полосой Root, и передает экземпляр CubaJRFunction в отчёт в качестве основного источника данных. Обратиться к источнику данных можно с помощью параметра REPORTING. Этот параметр объявлять в шаблоне не обязательно, он будет добавлен автоматически, однако если вы хотите компилировать отчёты в JasperReports IDE, объявите параметр явно.

Для параметра REPORTING доступны следующие два метода:

  • dataset – получает вложенный источник данных из основного источника, который можно использовать, например, в таблицах или подотчётах в качестве subDataset. Метод ищет среди наследников полосы Root полосу с указанным именем и создает новый источник данных только из этой полосы. Например:

    <subDataset name="Product">
            <field name="name" class="java.lang.String"/>
            <field name="price" class="java.lang.Long"/>
    </subDataset>
    ...
    <dataSourceExpression><![CDATA[$P{REPORTING}.dataset("Product")]]></dataSourceExpression>
  • bitmap – преобразует переданный массив байтов в ByteArrayInputStream, который можно использовать для вставки изображений в отчёт. Например:

<field name="Main.image" class="java.lang.Object"/> //image from DB as byte array
...
<imageExpression><![CDATA[$P{REPORTING}.bitmap($F{Main.image})]]></imageExpression>

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

Вставить значения из источника данных в поле можно, используя следующий синтаксис: $F{<field name>}. Например:

<textField>
    <textFieldExpression><![CDATA[$F{library_department_name}]]></textFieldExpression>
</textField>

Пример отчёта, использующего шаблон JasperReports, доступен в разделе Примеры отчётов.

Если ваше приложение развернуто в the UberJAR, чтобы запустить JasperReports из UberJAR, сделайте следующее:

  • Скопируйте файлы jasperreports-.jar и yarg-.jar в каталог uber JAR;

  • Создайте файл jasperreports.properties в каталоге uber JAR;

  • Добавьте в него свойство net.sf.jasperreports.compiler.classpath с именами скопированных JAR-файлов в качестве значения, к примеру:

net.sf.jasperreports.compiler.classpath = jasperreports-6.9.0.jar;yarg-2.0-SNAPSHOT.jar