JasperReports con la primavera

1. Panoramica

JasperReports è una libreria di report open source che consente agli utenti di creare report perfetti per i pixel che possono essere stampati o esportati in molti formati tra cui PDF, HTML e XLS.

In questo articolo, esploreremo le sue caratteristiche e classi chiave e implementeremo esempi per mostrare le sue capacità.

2. Dipendenza da Maven

Per prima cosa, dobbiamo aggiungere la dipendenza jasperreports al nostro pom.xml :

 net.sf.jasperreports jasperreports 6.4.0 

L'ultima versione di questo artefatto può essere trovata qui.

3. Modelli di report

I progetti di report sono definiti nei file JRXML. Questi sono normali file XML con una struttura particolare che il motore di JasperReports può interpretare.

Diamo ora uno sguardo solo alla struttura rilevante dei file JRXML - per comprendere meglio la parte Java del processo di generazione dei report, che è il nostro obiettivo principale.

Creiamo un semplice report per mostrare le informazioni sui dipendenti:

3.1. Compilazione di rapporti

I file JRXML devono essere compilati in modo che il motore di report possa riempirli di dati.

Eseguiamo questa operazione con l'aiuto della classe JasperCompilerManager :

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

Per evitare di compilarlo ogni volta, possiamo salvarlo in un file:

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

4. Popolamento dei rapporti

Il modo più comune per compilare i report compilati è con i record di un database. Ciò richiede che il report contenga una query SQL che il motore eseguirà per ottenere i dati.

Innanzitutto, modifichiamo il nostro report per aggiungere una query SQL:

    ... 

Ora creiamo una semplice origine dati:

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

Ora possiamo compilare il rapporto:

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

Si noti che stiamo passando null al secondo argomento poiché il nostro report non riceve ancora alcun parametro.

4.1. Parametri

I parametri sono utili per passare dati al motore di report che non riesce a trovare nella sua origine dati o quando i dati cambiano a seconda delle diverse condizioni di runtime.

Possiamo anche cambiare parti o anche l'intera query SQL con i parametri ricevuti nell'operazione di compilazione del report.

Innanzitutto, modifichiamo il rapporto per ricevere tre parametri:

       // ... 

Ora aggiungiamo una sezione del titolo per mostrare il parametro del titolo :

 // ...           ... 

Successivamente, modifichiamo la query per utilizzare i parametri minSalary e condition :

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

Notare la diversa sintassi quando si utilizza il parametro condition . Ciò indica al motore che il parametro non deve essere utilizzato come parametro PreparedStatement standard , ma come se il valore di quel parametro fosse stato scritto originariamente nella query SQL.

Infine, prepariamo i parametri e compiliamo il report:

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, ...);

Notare che le chiavi dei parametri corrispondono ai nomi dei parametri nel report. Se il motore rileva la mancanza di un parametro, otterrà il valore da defaultValueExpression del parametro, se presente.

5. Esportazione

Per esportare un report, in primo luogo, istanziamo un oggetto di una classe di esportazione che corrisponde al formato di file di cui abbiamo bisogno.

Quindi, impostiamo il nostro precedente rapporto compilato come input e definiamo dove produrre il file risultante.

Facoltativamente, possiamo impostare il report corrispondente ed esportare oggetti di configurazione per personalizzare il processo di esportazione.

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. Sottoreport

I sottoreport non sono altro che un report standard incorporato in un altro report.

Per prima cosa, creiamo un report per mostrare le email di un dipendente:

Ora modifichiamo il nostro rapporto sui dipendenti per includere quello precedente:

Si noti che stiamo facendo riferimento al sottoreport con il nome del file compilato e passandogli idEmployee e la connessione del report corrente come parametri.

Successivamente, compiliamo entrambi i rapporti:

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

Il nostro codice per la compilazione e l'esportazione del report non richiede modifiche.

7. Conclusione

In questo articolo, abbiamo dato una breve occhiata alle funzionalità principali della libreria JasperReports.

Siamo stati in grado di compilare e popolare report con record da un database; abbiamo passato i parametri per modificare i dati mostrati nel report in base alle diverse condizioni di runtime, abbiamo incorporato i sottoreport e li abbiamo esportati nei formati più comuni.

Il codice sorgente completo per questo articolo può essere trovato su GitHub.