JasperReports с весны

Джаспер Репорты с Весной

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:


    // ...
    
        <band height="20" splitType="Stretch">
            <textField>
                <reportElement x="238" y="0" width="100" height="20"/>
                <textElement/>
                <textFieldExpression class="java.lang.String">
                  <![CDATA[$P{title}]]></textFieldExpression>
            </textField>
        </band>
    
    ...

Затем давайте изменим запрос, чтобы использовать параметры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.