Компиляция дочерних (subreport) шаблонов в JasperReports

Сегодня возился с одним отчётом, который фактически состоит из двух  других полноценных отчётов. Я сделал один отчёт-контейнер, в котором две секции Details. В каждой из секций разместил элемент <subreport>. Элемент <subreport> указывает на скомпилированный шаблон отчёта с помощью элемента <subreportExpression>, в котором можно указать адрес скомпилированного шаблона ( *.jasper ). В моём проекте компиляция шаблонов происходила в память, файлы не создавались. Я решил не менять пока текущую структуру генерации отчётов, принятую в проекте.

Сначала я сделал передачу скомпилированных отчётов в параметры отчёта, а в самом шаблоне-контейнере указывал так:

Обратите внимание на <subreportExpression>. Там используется параметр отчёта, то есть в шаблоне должен быть объявлен указанный параметр operations_cost_report. Вот так:

При генерации отчёта в качестве аргумента в этот параметр нужно передавать скомпилированный шаблон, то есть класс  net.sf.jasperreports.engine.JasperReport.

Но как сделать так, чтобы дочерние отчёты сами компилировались? В проекте, над которым я работаю все шаблоны находятся в src/main/resources/report, то есть в classpath. Поэтому я решил, что будут давать параметру имя, равное имени файла с шаблоном, но без расширения. Например, в случае когда файл шаблона имеет имя operations_cost_report.jrxml, параметр будет иметь имя operations_cost_report. Теперь если посмотреть все элементы <subreport> в шаблоне, то можно узнать имена файлов, которые нужно скомпилировать и передать в качестве аргументов. Код компиляции шаблона с компиляцией всех подшаблонов по описанному выше принципу:

 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *