Jasper Rapporter med forår

1. Oversigt

JasperReports er et open source-rapporteringsbibliotek, der gør det muligt for brugere at oprette pixel-perfekte rapporter, der kan udskrives eller eksporteres i mange formater, herunder PDF, HTML og XLS.

I denne artikel vil vi udforske dens nøglefunktioner og klasser og implementere eksempler for at fremvise dens muligheder.

2. Maven-afhængighed

Først skal vi tilføje jasperrapporter afhængighed af vores pom.xml:

 net.sf.jasperreports jasperrapporter 6.4.0 

Den seneste version af denne artefakt kan findes her.

3. Rapportskabeloner

Rapportdesign er defineret i JRXML-filer. Dette er almindelige XML-filer med en bestemt struktur, som JasperReports-motoren kan fortolke.

Lad os nu kun se på den relevante struktur for JRXML-filerne - for bedre at forstå Java-delen af ​​rapportgenereringsprocessen, som er vores primære fokus.

Lad os oprette en simpel rapport for at vise medarbejderoplysninger:

3.1. Kompilering af rapporter

JRXML-filer skal kompileres, så rapportmotoren kan udfylde dem med data.

Lad os udføre denne operation ved hjælp af JasperCompilerManager klasse:

InputStream-medarbejderReportStream = getClass (). GetResourceAsStream ("/ medarbejderrapport.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport (medarbejderReportStream);

For at undgå at kompilere det hver gang, kan vi gemme det i en fil:

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

4. Befolkning Rapporter

Den mest almindelige måde at udfylde kompilerede rapporter er med poster fra en database. Dette kræver, at rapporten indeholder en SQL-forespørgsel, som motoren udfører for at hente dataene.

Lad os først ændre vores rapport for at tilføje en SQL-forespørgsel:

    ... 

Lad os nu oprette en simpel datakilde:

@Bean public DataSource dataSource () {returner ny EmbeddedDatabaseBuilder () .setType (EmbeddedDatabaseType.HSQL) .addScript ("classpath: employee-schema.sql") .build (); }

Nu kan vi udfylde rapporten:

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

Bemærk, at vi passerer nul til det andet argument, da vores rapport endnu ikke modtager nogen parametre.

4.1. Parametre

Parametre er nyttige til overførsel af data til rapportmotoren, som den ikke kan finde i sin datakilde, eller når data ændres afhængigt af forskellige driftstidsforhold.

Vi kan også ændre dele eller endda hele SQL-forespørgslen med parametre modtaget i rapportudfyldningsoperationen.

Lad os først ændre rapporten for at modtage tre parametre:

       // ... 

Lad os nu tilføje en titelsektion for at vise titel parameter:

 // ...           ... 

Lad os derefter ændre forespørgslen for at bruge minLøn og tilstand parametre:

VÆLG * FRA MEDARBEJDER, HVOR LØN> = $ P {minSalary} OG $ P! {Betingelse}

Bemærk de forskellige syntaks, når du bruger tilstand parameter. Dette fortæller motoren, at parameteren ikke skal bruges som standard PreparedStatement parameter, men som om værdien af ​​denne parameter oprindeligt ville være skrevet i SQL-forespørgslen.

Lad os endelig forberede parametrene og udfylde rapporten:

Kortparametre = nyt HashMap (); parameters.put ("titel", "Medarbejderrapport"); parameters.put ("minSalary", 15000.0); parameters.put ("betingelse", "LAST_NAME = 'Smith' BESTILLING AF FIRST_NAME"); JasperPrint jasperPrint = JasperFillManager.fillReport (..., parametre, ...);

Bemærk, at tasterne til parametre svarer til parameternavne i rapporten. Hvis motoren registrerer, at en parameter mangler, får den værdien fra defaultValueExpression af parameteren, hvis nogen.

5. Eksport

For at eksportere en rapport starter vi først et objekt fra en eksportørklasse, der matcher det filformat, vi har brug for.

Derefter indstiller vi vores tidligere udfyldte rapport som input og definerer, hvor den resulterende fil skal sendes.

Eventuelt kan vi indstille tilsvarende rapport- og eksportkonfigurationsobjekter til at tilpasse eksportprocessen.

5.1. PDF

JRPdfExporter eksportør = ny JRPdfExporter (); exporter.setExporterInput (ny SimpleExporterInput (jasperPrint)); exporter.setExporterOutput (ny SimpleOutputStreamExporterOutput ("medarbejderrapport.pdf")); SimplePdfReportConfiguration reportConfig = ny SimplePdfReportConfiguration (); reportConfig.setSizePageToContent (true); reportConfig.setForceLineBreakPolicy (false); SimplePdfExporterConfiguration exportConfig = ny SimplePdfExporterConfiguration (); exportConfig.setMetadataAuthor ("baeldung"); exportConfig.setEncrypted (true); exportConfig.setAllowedPermissionsHint ("PRINTING"); eksportør.setConfiguration (reportConfig); eksportør.setConfiguration (exportConfig); eksportør. eksportrapport ();

5.2. XLS

JRXlsxExporter eksportør = ny JRXlsxExporter (); // Indstil input og output ... SimpleXlsxReportConfiguration reportConfig = ny SimpleXlsxReportConfiguration (); reportConfig.setSheetNames (ny streng [] {"Medarbejderdata"}); eksportør.setConfiguration (reportConfig); eksportør. eksportrapport ();

5.3. CSV

JRCsvExporter eksportør = ny JRCsvExporter (); // Indstil input ... exportør.setExporterOutput (ny SimpleWriterExporterOutput ("medarbejderrapport.csv")); eksportør. eksportrapport ();

5.4. HTML

HtmlExporter eksportør = ny HtmlExporter (); // Indstil input ... exportør.setExporterOutput (ny SimpleHtmlExporterOutput ("medarbejderrapport.html")); eksportør. eksportrapport ();

6. Underrapporter

Underrapporter er intet andet end en standardrapport indlejret i en anden rapport.

Lad os først oprette en rapport for at vise e-mails fra en medarbejder:

Lad os nu ændre vores medarbejderrapport, så den inkluderer den forrige:

Bemærk, at vi henviser til underrapporten med navnet på den kompilerede fil og sender den til idMedarbejder og den aktuelle rapportforbindelse som parametre.

Lad os derefter sammensætte begge rapporter:

InputStream-medarbejderReportStream = getClass (). GetResourceAsStream ("/ medarbejderrapport.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport (medarbejderReportStream); JRSaver.saveObject (jasperReport, "medarbejderReport.jasper"); InputStream emailReportStream = getClass (). GetResourceAsStream ("/ medarbejderEmailReport.jrxml"); JRSaver.saveObject (JasperCompileManager.compileReport (emailReportStream), "medarbejderEmailReport.jasper");

Vores kode til udfyldning og eksport af rapporten kræver ikke ændringer.

7. Konklusion

I denne artikel havde vi et kort kig på kernefunktionerne i JasperReports-biblioteket.

Vi var i stand til at kompilere og udfylde rapporter med poster fra en database; vi passerede parametre for at ændre dataene vist i rapporten i henhold til forskellige runtime-forhold, indlejrede underrapporter og eksporterede dem til de mest almindelige formater.

Komplet kildekode til denne artikel kan findes på GitHub.