Desde el viernes pasado me había topado con un problema en la utilización de Json como fuente de datos en Jasper Report utilizando sub-reportes.
El reporte lo realice utilizando ireport 5; consiste en un reporte principal con dos sub-reportes. En el reporte principal hay que crear dos parámetros de la siguiente manera:
<parameter name="dsEncabezado" class="net.sf.jasperreports.engine.JRDataSource" isForPrompting="false"/> <parameter name="dsDetalle" class="net.sf.jasperreports.engine.JRDataSource" isForPrompting="false"/> |
Además hay que agregar a cada una de las líneas en el reporte principal donde hace referencia a los sub-reportes las siguientes líneas:
<subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "Encabezado.jasper"]]></subreportExpression> ... <subreportExpression><![CDATA[$P{SUBREPORT_DIR} + "Detalle.jasper"]]></subreportExpression> |
Ahora en Java, las librerías que utilice son:
- jasperreports-4.7.0
- jackson-all-1.9.11
- log4j-1.2.17
- commons-beanutils-1.8.3
- commons-collections-3.2.1
- commons-digester-2.1
- commons-logging-1.1.1
- itext-2.1.7
En la clase de Java, hay que agregar el siguiente código en la clase main:
public static void main(String[] args) { try { String sjson = "{" + "ENCABEZADO : [" + " {MATERIA:\"ESPAÑOL\",NUMEROAPROBADOS:\"123\",NUMEROREPLOBADOS:\"1\"}," + " {MATERIA:\"INGLES\",NUMEROAPROBADOS:\"120\",NUMEROREPLOBADOS:\"4\"}" + " ], " + "DETALLES :[" + " {NOMBREALUMNO:\"GUADALUPE VICTORIA\",ESPAÑOL:\"10\",INGLES:\"9\"}," + " {NOMBREALUMNO:\"VICENTE GUERRERO\",ESPAÑOL:\"9\",INGLES:\"8\"}" + " ] " + "}"; String reportPath = "X:\\Jasper\\"; HashMap params = new HashMap(); params.put("SUBREPORT_DIR", reportPath); params.put("dsEncabezado", new JsonDataSource(new ByteArrayInputStream(sjson.getBytes("UTF-8")),"ENCABEZADO")); params.put("dsDetalle", new JsonDataSource(new ByteArrayInputStream(sjson.getBytes("UTF-8")),"DETALLES")); JsonDataSource datasource = new JsonDataSource(new ByteArrayInputStream(sjson.getBytes("UTF-8"))); JasperPrint objJasperPrint = JasperFillManager.fillReport( new FileInputStream(new File(reportPath + "General.jasper")), params, datasource ); byte[] exportReportToPdf = JasperExportManager.exportReportToPdf(objJasperPrint); FileOutputStream pdf = new FileOutputStream(reportPath + "prueba.pdf"); pdf.write(exportReportToPdf); pdf.close(); } catch(Exception e) { e.printStackTrace(); } } |