Рубрики
Без рубрики

JasperReports с весной

Краткое и практическое руководство по настройке JasperReports с помощью Spring.

Автор оригинала: baeldung.

1. Обзор

JasperReports -это библиотека отчетов с открытым исходным кодом, которая позволяет пользователям создавать пиксельные отчеты, которые могут быть распечатаны или экспортированы во многих форматах, включая PDF, HTML и XLS.

В этой статье мы рассмотрим его ключевые функции и классы, а также реализуем примеры, демонстрирующие его возможности.

2. Зависимость Maven

Во-первых, нам нужно добавить зависимость jasperreports к вашему pom.xml :


    net.sf.jasperreports
    jasperreports
    6.4.0

Последнюю версию этого артефакта можно найти здесь .

3. Шаблоны отчетов

Проекты отчетов определяются в файлах JRXML. Это обычные XML-файлы с определенной структурой, которую может интерпретировать движок JasperReports.

Теперь давайте рассмотрим только соответствующую структуру файлов JRXML – чтобы лучше понять Java-часть процесса генерации отчетов, которая является нашим основным фокусом.

Давайте создадим простой отчет, чтобы показать информацию о сотрудниках:


    
    
    
    
    
        
            
                
                
                
                  
            
            
                
                
                
                  
            
            
                
                
                
                  
            
        
    

3.1. Составление Отчетов

Файлы JRXML должны быть скомпилированы, чтобы механизм отчетов мог заполнять их данными.

Давайте выполним эту операцию с помощью класса Jaspercompilemanager :

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 :


    // ...
    
        <band height="20" splittype="Stretch">
            <textfield>
                <reportelement height="20" width="100" x="238" y="0"></reportelement>
                <textelement></textelement>
                <textfieldexpression class="java.lang.String">
                  <![CDATA[$P{title}]]></textfieldexpression>
            </textfield>
        </band>
    
    ...

Далее давайте изменим запрос, чтобы использовать параметры min Salary и condition :

SELECT * FROM EMPLOYEE
  WHERE SALARY >= $P{minSalary} AND $P!{condition}

Обратите внимание на другой синтаксис при использовании параметра condition . Это говорит движку, что параметр следует использовать не как стандартный Подготовленный оператор параметр, а как если бы значение этого параметра было записано изначально в 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. Экспорт

Чтобы экспортировать отчет, сначала мы создаем экземпляр объекта класса exporter, который соответствует нужному нам формату файла.

Затем мы устанавливаем наш предыдущий заполненный отчет в качестве входных данных и определяем, куда выводить полученный файл.

При желании мы можем установить соответствующие объекты конфигурации отчета и экспорта для настройки процесса экспорта.

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("baeldung");
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.

Мы смогли компилировать и заполнять отчеты записями из базы данных; мы передавали параметры для изменения данных, отображаемых в отчете, в соответствии с различными условиями выполнения, внедряли вложенные отчеты и экспортировали их в наиболее распространенные форматы.

Полный исходный код этой статьи можно найти на GitHub .