Джаспер Репорты с Весной
1. обзор
JasperReports - это библиотека отчетов с открытым исходным кодом, которая позволяет пользователям создавать отчеты с точностью до пикселя, которые можно распечатать или экспортировать во многих форматах, включая PDF, HTML и XLS.
В этой статье мы рассмотрим его ключевые функции и классы, а также реализуем примеры, чтобы продемонстрировать его возможности.
2. Maven Dependency
Во-первых, нам нужно добавить зависимостьjasperreports к нашемуpom.xml:
net.sf.jasperreports
jasperreports
6.4.0
Последнюю версию этого артефакта можно найтиhere.
3. Шаблоны отчетов
Дизайн отчетов определяется в файлах JRXML. Это обычные XML-файлы с определенной структурой, которую может интерпретировать механизм JasperReports.
Давайте теперь посмотрим только на соответствующую структуру файлов JRXML, чтобы лучше понять Java-часть процесса создания отчетов, которая является нашей основной задачей.
Давайте создадим простой отчет для отображения информации о сотрудниках:
3.1. Составление отчетов
Файлы JRXML должны быть скомпилированы, чтобы механизм отчетов мог заполнить их данными.
Проделаем эту операцию с помощью классаJasperCompilerManager:
InputStream employeeReportStream
= getClass().getResourceAsStream("/employeeReport.jrxml");
JasperReport jasperReport
= JasperCompileManager.compileReport(employeeReportStream);
Чтобы не компилировать его каждый раз, мы можем сохранить его в файл:
JRSaver.saveObject(jasperReport, "employeeReport.jasper");
4. Заполнение Отчеты
Наиболее распространенный способ заполнить скомпилированные отчеты - это записи из базы данных. Для этого требуется, чтобы в отчете содержался SQL-запрос, который механизм будет выполнять для получения данных.
Во-первых, давайте изменим наш отчет, добавив SQL-запрос:
...
Теперь давайте создадим простой источник данных:
@Bean
public DataSource dataSource() {
return new EmbeddedDatabaseBuilder()
.setType(EmbeddedDatabaseType.HSQL)
.addScript("classpath:employee-schema.sql")
.build();
}
Теперь мы можем заполнить отчет:
JasperPrint jasperPrint = JasperFillManager.fillReport(
jasperReport, null, dataSource.getConnection());
Обратите внимание, что мы передаемnull второму аргументу, поскольку наш отчет еще не получил никаких параметров.
4.1. параметры
Параметры полезны для передачи данных в механизм отчетов, которые он не может найти в своем источнике данных, или когда данные изменяются в зависимости от различных условий выполнения.
Мы также можем изменить части или даже весь SQL-запрос с параметрами, полученными в операции заполнения отчета.
Во-первых, давайте изменим отчет так, чтобы он получал три параметра:
// ...
Теперь давайте добавим раздел заголовка, чтобы показать параметрtitle:
// ...
...
Затем давайте изменим запрос, чтобы использовать параметрыminSalary иcondition:
SELECT * FROM EMPLOYEE
WHERE SALARY >= $P{minSalary} AND $P!{condition}
Обратите внимание на другой синтаксис при использовании параметраcondition. Это сообщает механизму, что параметр не следует использовать как стандартный параметрPreparedStatement, а как если бы значение этого параметра было изначально записано в запросе SQL.
Наконец, подготовим параметры и заполним отчет:
Map parameters = new HashMap<>();
parameters.put("title", "Employee Report");
parameters.put("minSalary", 15000.0);
parameters.put("condition", " LAST_NAME ='Smith' ORDER BY FIRST_NAME");
JasperPrint jasperPrint
= JasperFillManager.fillReport(..., parameters, ...);
Обратите внимание, что ключиparameters соответствуют именам параметров в отчете. Если механизм обнаруживает, что параметр отсутствует, он получит значение изdefaultValueExpression параметра, если таковой имеется.
5. Экспорт
Чтобы экспортировать отчет, сначала мы создаем объект класса-экспортера, который соответствует нужному формату файла.
Затем мы устанавливаем наш предыдущий заполненный отчет в качестве входных данных и определяем, куда выводить полученный файл.
При желании мы можем установить соответствующий отчет и экспортировать объекты конфигурации, чтобы настроить процесс экспорта.
5.1. PDF
JRPdfExporter exporter = new JRPdfExporter();
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
exporter.setExporterOutput(
new SimpleOutputStreamExporterOutput("employeeReport.pdf"));
SimplePdfReportConfiguration reportConfig
= new SimplePdfReportConfiguration();
reportConfig.setSizePageToContent(true);
reportConfig.setForceLineBreakPolicy(false);
SimplePdfExporterConfiguration exportConfig
= new SimplePdfExporterConfiguration();
exportConfig.setMetadataAuthor("example");
exportConfig.setEncrypted(true);
exportConfig.setAllowedPermissionsHint("PRINTING");
exporter.setConfiguration(reportConfig);
exporter.setConfiguration(exportConfig);
exporter.exportReport();
5.2. XLS
JRXlsxExporter exporter = new JRXlsxExporter();
// Set input and output ...
SimpleXlsxReportConfiguration reportConfig
= new SimpleXlsxReportConfiguration();
reportConfig.setSheetNames(new String[] { "Employee Data" });
exporter.setConfiguration(reportConfig);
exporter.exportReport();
5.3. CSV
JRCsvExporter exporter = new JRCsvExporter();
// Set input ...
exporter.setExporterOutput(
new SimpleWriterExporterOutput("employeeReport.csv"));
exporter.exportReport();
5.4. HTML
HtmlExporter exporter = new HtmlExporter();
// Set input ...
exporter.setExporterOutput(
new SimpleHtmlExporterOutput("employeeReport.html"));
exporter.exportReport();
6. Вложенные отчеты
Подотчеты - это не что иное, как стандартный отчет, встроенный в другой отчет.
Во-первых, давайте создадим отчет, в котором будут отображаться электронные письма сотрудника:
Теперь давайте изменим наш отчет о сотрудниках, включив в него предыдущий:
Обратите внимание, что мы ссылаемся на подотчет по имени скомпилированного файла и передаем емуidEmployee и текущее соединение с отчетом в качестве параметров.
Теперь давайте скомпилируем оба отчета:
InputStream employeeReportStream
= getClass().getResourceAsStream("/employeeReport.jrxml");
JasperReport jasperReport
= JasperCompileManager.compileReport(employeeReportStream);
JRSaver.saveObject(jasperReport, "employeeReport.jasper");
InputStream emailReportStream
= getClass().getResourceAsStream("/employeeEmailReport.jrxml");
JRSaver.saveObject(
JasperCompileManager.compileReport(emailReportStream),
"employeeEmailReport.jasper");
Наш код для заполнения и экспорта отчета не требует доработки.
7. Заключение
В этой статье мы кратко рассмотрели основные функции библиотеки JasperReports.
Мы смогли составить и заполнить отчеты с записями из базы данных; мы передали параметры для изменения данных, отображаемых в отчете, в соответствии с различными условиями выполнения, встроенными вложенными отчетами и экспортировали их в наиболее распространенные форматы.
Полный исходный код этой статьи можно найти вover on GitHub.