Creare un report con java  e jasper

Creare un report con java e jasper

Per produrre un report, abbiamo inanzitutto bisogno di creare il file .jasper .
Questo file si ottiene una volta compilato il file .jrxml in cui è stata salvata la struttura del record e le eventuali query da eseguire per la creazione del report.
Possiamo creare entrambi i files tramite IReport , che ci rende più facile la creazione della struttura grafica del report.

Una volta creato il file .jasper ( o il .jrxml ) dobbiamo aggiungere le corrette librerie al nostro progetto.
In particolare, se abbiamo usato la versione (per esempio) 3.5.0 di IReport allora dovremo scaricare ed aggiungere al nostro progetto java la libreria jasperreports-3.5.0.jar ( è importante che la versione del jar coincida con la versione dell’applicativo con cui è stato creato il file .jasper) ed inoltre la libreria jasper-el.jar che è la libreria di implementazione del Jasper Expression Language .

Una volta ciò possiamo utilizzare un semplice batch java che ci permetta di creare e popolare il report.
Ovviamente i dati vanno recuperati da una qualche fonte.
Nel caso in cui debbano essere recuperati da DataBase, un problema che mi è capitato è quello di ottenere una connessione nativa al database quando si vuole effettuare la chiamata da dentro un Enterprise Java Bean ed, in generale, quando l’applicativo è in esecuzione su un Application Server che gestisce autonomamente le transazioni con il database.

Vediamo il codice per la creazione di un report in pdf :

    
			String nomeFile = ConfigurazioneStatica.NOME_FILES_REPORT_COI;
			
			Map par = 
				new HashMap();

			Properties prp = new Properties();
			Context ctx = new InitialContext(prp);
			
			//  recupero l'interfaccia DataSource da cui possiamo rpelevare la connessione nativa per il database
			// N.B. queta interfaccia viene implementata dal writer del driver JDBC del DataBase che stiamo utilizzando
			// proprio per questo , il metodo getConnection() ci ritorna una connessione nativa che, come detto sopra, ci
			// servirà per popolare il report tramite  queries o stored procedures
			javax.sql.DataSource ds = (DataSource)ctx.lookup("jdbc/"+ nome_data_source_database);
			Jconnection = ds.getConnection();
		
			JRProperties.setProperty("net.sf.jasperreports.query.executer.factory.plsql","org.jasperforge.jaspersoft.demo.PlSqlQueryExecuterFactory");
			par.put("param", new Integer(12345));
	
			// path del file .jasper contenente la struttura del report
			path = this.getClass().getResource(PATH_FILE_STRUTTURA_JASPER_WEB).getPath();
			try 
			{
				
				JasperPrint jprint = JasperFillManager.fillReport(path, par, Jconnection);
				
				ByteArrayOutputStream  out = new ByteArrayOutputStream();
			
				JasperExportManager.exportReportToPdfStream(jprint,out);
				out.flush();
			}
			catch(Exception e)
			{
				out.close();
				out = null;
				logger.error("Errore in creazione fill: "+e.getMessage());
			}

Nel dettaglio :

La seguente linea permette di impostare la corretta factory per effettuare il parse e l’elaborazione delle chiamate a stored procedures
o a queries PLSQL.
PlSqlQueryExecuterFactory si trova all’interno della libreria jasperreports-extensions-3.5.0.jar

  
JRProperties.setProperty("net.sf.jasperreports.query.executer.factory.plsql","org.jasperforge.jaspersoft.demo.PlSqlQueryExecuterFactory");

La seguente riga , invece, prepara e riempie il file di report compilato( .jasper).
Oltre al path del file e alla connessione nativa al database , viene passato anche un oggetto Map che contiene i valori dei vari parametri che verranno utilizzati nella creazione del report ( variabili da valorizzare per le queries/stored procedures, valori da inserire nell’ intestazione/body/footer del report etc)

 
JasperPrint jprint = JasperFillManager.fillReport(path, par, Jconnection);

Il costruttore della classe JasperPrint, permette anche di creare un documento vuoto a cui possono essere aggiunte N pagine JRPrintPage contenenti N elementi JRPrintElement

Come detto in precedenza, possiamo creare il file .jasper a partire dal file di struttura jrxml.
Di sotto vi è una parte di codice che utilizza il file jrxml per creare il file compilato tramite il
metodo compileReport, e quindi popolarlo con dei dati :

  
InputStream inputStream = new FileInputStream ("reports/test_jasper.jrxml");
 
DataBeanMaker dataBeanMaker = new DataBeanMaker();
Collection dataBeanList = getDataBeanList();
 
JRBeanCollectionDataSource datiReport = new JRBeanCollectionDataSource(dataBeanList);
 
Map parameters = new HashMap();
 
JasperDesign jasperDesign = JRXmlLoader.load(inputStream);
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, datiReport);
JasperExportManager.exportReportToPdfFile(jasperPrint, "c:/reports/test_jasper.pdf"); 

Nell’ esempio principale abbiamo usato un metodo diverso per la creazione del pdf:

JasperExportManager.exportReportToPdfStream(jprint,out);

Questo metodo , a differenza del metodo exportReportToPdfFile, ci permette di creare il file come uno stream di byte ByteArrayOutputStream , che può essere facilmente manipolato per essere rediretto verso una pagina web tramite servlet, oppure memorizzato su file, oppure salvato su un campo BLOB su Database.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *