JasperReports met Spring

1. Overzicht

JasperReports is een open source rapportagebibliotheek waarmee gebruikers pixel-perfecte rapporten kunnen maken die kunnen worden afgedrukt of geëxporteerd in vele formaten, waaronder pdf, html en xls.

In dit artikel zullen we de belangrijkste functies en klassen verkennen en voorbeelden implementeren om de mogelijkheden ervan te demonstreren.

2. Maven Afhankelijkheid

Eerst moeten we de jasperrapporten afhankelijkheid van onze pom.xml:

 net.sf.jasperreports jasperreports 6.4.0 

De nieuwste versie van dit artefact is hier te vinden.

3. Rapportsjablonen

Rapportontwerpen worden gedefinieerd in JRXML-bestanden. Dit zijn gewone XML-bestanden met een bepaalde structuur die de JasperReports-engine kan interpreteren.

Laten we nu alleen kijken naar de relevante structuur van de JRXML-bestanden - om het Java-gedeelte van het rapportgeneratieproces, dat onze primaire focus is, beter te begrijpen.

Laten we een eenvoudig rapport maken om werknemersinformatie te tonen:

3.1. Rapporten samenstellen

JRXML-bestanden moeten worden gecompileerd zodat de rapportengine ze met gegevens kan vullen.

Laten we deze bewerking uitvoeren met behulp van de JasperCompilerManager klasse:

InputStream employeeReportStream = getClass (). GetResourceAsStream ("/ employeeReport.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport (employeeReportStream);

Om te voorkomen dat het elke keer compileert, kunnen we het opslaan in een bestand:

JRSaver.saveObject (jasperReport, "employeeReport.jasper");

4. Bevolking Rapporten

De meest gebruikelijke manier om gecompileerde rapporten in te vullen, is met records uit een database. Dit vereist dat het rapport een SQL-query bevat die de engine zal uitvoeren om de gegevens te verkrijgen.

Laten we eerst ons rapport aanpassen om een ​​SQL-query toe te voegen:

    ... 

Laten we nu een eenvoudige gegevensbron maken:

@Bean openbare DataSource dataSource () {retourneer nieuwe EmbeddedDatabaseBuilder () .setType (EmbeddedDatabaseType.HSQL) .addScript ("classpath: employee-schema.sql") .build (); }

Nu kunnen we het rapport invullen:

JasperPrint jasperPrint = JasperFillManager.fillReport (jasperReport, null, dataSource.getConnection ());

Merk op dat we passeren nul naar het tweede argument omdat ons rapport nog geen parameters heeft ontvangen.

4.1. Parameters

Parameters zijn handig voor het doorgeven van gegevens aan de rapportengine die deze niet in de gegevensbron kan vinden of wanneer gegevens veranderen afhankelijk van verschillende runtime-omstandigheden.

We kunnen ook delen of zelfs de volledige SQL-query wijzigen met parameters die zijn ontvangen tijdens het invullen van rapporten.

Laten we eerst het rapport aanpassen om drie parameters te ontvangen:

       // ... 

Laten we nu een titelsectie toevoegen om het titel parameter:

 // ...           ... 

Laten we vervolgens de query wijzigen om de minSalaris en staat parameters:

SELECTEER * UIT WERKNEMER WAAR SALARIS> = $ P {minSalary} EN $ P! {Voorwaarde}

Let op de verschillende syntaxis bij het gebruik van de staat parameter. Dit vertelt de motor dat de parameter niet als standaard moet worden gebruikt PreparedStatement parameter, maar alsof de waarde van die parameter oorspronkelijk in de SQL-query zou zijn geschreven.

Laten we tot slot de parameters voorbereiden en het rapport invullen:

Kaartparameters = nieuwe HashMap (); parameters.put ("titel", "Werknemersrapport"); parameters.put ("minSalary", 15000.0); parameters.put ("condition", "LAST_NAME = 'Smith' ORDER BY FIRST_NAME"); JasperPrint jasperPrint = JasperFillManager.fillReport (..., parameters, ...);

Merk op dat de sleutels van parameters komen overeen met parameternamen in het rapport. Als de engine detecteert dat een parameter ontbreekt, krijgt deze de waarde van defaultValueExpression van de parameter, indien aanwezig.

5. Exporteren

Om een ​​rapport te exporteren, instantiëren we eerst een object van een exporterklasse dat overeenkomt met het bestandsformaat dat we nodig hebben.

Vervolgens stellen we ons vorige gevulde rapport in als invoer en definiëren we waar het resulterende bestand moet worden uitgevoerd.

Optioneel kunnen we bijbehorende rapport- en exportconfiguratieobjecten instellen om het exportproces aan te passen.

5.1. Pdf

JRPdfExporter exporter = nieuwe JRPdfExporter (); exporter.setExporterInput (nieuwe SimpleExporterInput (jasperPrint)); exporter.setExporterOutput (nieuwe SimpleOutputStreamExporterOutput ("employeeReport.pdf")); SimplePdfReportConfiguration reportConfig = nieuwe SimplePdfReportConfiguration (); reportConfig.setSizePageToContent (true); reportConfig.setForceLineBreakPolicy (false); SimplePdfExporterConfiguration exportConfig = nieuwe SimplePdfExporterConfiguration (); exportConfig.setMetadataAuthor ("baeldung"); exportConfig.setEncrypted (true); exportConfig.setAllowedPermissionsHint ("PRINTING"); exporter.setConfiguration (reportConfig); exporter.setConfiguration (exportConfig); exporter.exportReport ();

5.2. XLS

JRXlsxExporter exporter = nieuwe JRXlsxExporter (); // Stel invoer en uitvoer in ... SimpleXlsxReportConfiguration reportConfig = nieuwe SimpleXlsxReportConfiguration (); reportConfig.setSheetNames (nieuwe String [] {"Werknemersgegevens"}); exporter.setConfiguration (reportConfig); exporter.exportReport ();

5.3. CSV

JRCsvExporter exporter = nieuwe JRCsvExporter (); // Set input ... exporter.setExporterOutput (nieuwe SimpleWriterExporterOutput ("employeeReport.csv")); exporter.exportReport ();

5.4. HTML

HtmlExporter-exporteur = nieuwe HtmlExporter (); // Set input ... exporter.setExporterOutput (nieuwe SimpleHtmlExporterOutput ("employeeReport.html")); exporter.exportReport ();

6. Subrapporten

Subrapporten zijn niets meer dan een standaardrapport dat is ingesloten in een ander rapport.

Laten we eerst een rapport maken om de e-mails van een medewerker te tonen:

Laten we nu ons werknemersrapport aanpassen om het vorige op te nemen:

Merk op dat we naar het subrapport verwijzen met de naam van het gecompileerde bestand en het de idEmployee en huidige rapportverbinding als parameters.

Laten we vervolgens beide rapporten samenstellen:

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");

Onze code voor het invullen en exporteren van het rapport vereist geen aanpassingen.

7. Conclusie

In dit artikel hebben we de kernfuncties van de JasperReports-bibliotheek kort bekeken.

We waren in staat om rapporten samen te stellen en te vullen met records uit een database; we hebben parameters doorgegeven om de gegevens die in het rapport worden weergegeven te wijzigen op basis van verschillende runtime-omstandigheden, ingesloten subrapporten en deze geëxporteerd naar de meest gangbare formaten.

De volledige broncode voor dit artikel is te vinden op GitHub.