2012-07-18 56 views
13

Está bien cuando crea el informe de Jasper (PDF, Excel, Csv) utilizando JRBeanCollectionDataSource. Significa que el archivo .jrxml acepta la colección de pojo como entrada para procesar el informe.Crear el formulario de Jasper Report PDF desde JSON Object o JSON String

Ahora, he estado tratando de crear el informe de jaspe con el mismo archivo .jrxml pero desde el objeto JSON. He intentado lo siguiente, pero todos los valores son nulos en el informe pdf

Resource resource = new ClassPathXmlApplicationContext().getResource("classpath:reports/project.jrxml"); 
JsonDataSource ds = new JsonDataSource(new File("c:\myjson.json")); 
jasperDesign = JRXmlLoader.load(resource.getInputStream()); 
JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign); 
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, ds); 
JasperExportManager.exportReportToPdfFile(jasperPrint, destination+fileName+".pdf"); 

Puede alguien ayudarme?

+0

¿Alguna vez lo hiciste funcionar? Estoy intentando lo mismo ahora – Marianna

Respuesta

18

He estado luchando con el uso de JSON como el DataSource para un informe de Jasper y con la falta de ejemplos decentes en la red pensé que publicaría esto aquí para referencia futura.

Este ejemplo es cómo usar iReport Designer y un JSON DataSource.

En primer lugar, el JSON de entrada:

{ 
    "userName": "Evil Raat", 
    "details": { 
     "email": "[email protected]" 
    } 
} 

continuación, crear un origen de datos JSON en iReport Designer y lo señala en su archivo (dejando a todos los demás detalles como sus valores por defecto)

A continuación, puede utilizar la jrxml siguiente plantilla para hacer que el JSON anterior en un informe:

<?xml version="1.0" encoding="UTF-8"?> 
<jasperReport xmlns="http://jasperreports.sourceforge.net/jasperreports" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports http://jasperreports.sourceforge.net/xsd/jasperreport.xsd" name="sample" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="a894078a-929b-4aae-a1d0-46485f0f8835"> 
    <property name="ireport.zoom" value="1.0"/> 
    <property name="ireport.x" value="0"/> 
    <property name="ireport.y" value="0"/> 
    <queryString language="json"> 
     <![CDATA[]]> 
    </queryString> 
    <field name="userName" class="java.lang.String"> 
     <fieldDescription><![CDATA[userName]]></fieldDescription> 
    </field> 
    <field name="userEmail" class="java.lang.String"> 
     <fieldDescription><![CDATA[details.email]]></fieldDescription> 
    </field> 
    <title> 
     <band height="200" splitType="Stretch"> 
      <textField> 
       <reportElement uuid="3b74775b-4555-43c3-bdf2-1677145c8660" x="0" y="31" width="555" height="20"/> 
       <textElement textAlignment="Right"> 
        <font fontName="Helvetica" size="12" isBold="true"/> 
       </textElement> 
       <textFieldExpression><![CDATA[$F{userName}]]></textFieldExpression> 
      </textField> 
      <textField> 
       <reportElement uuid="aa6cc7c8-2ca1-4f0f-92e2-c466083daba0" x="0" y="54" width="555" height="20"/> 
       <textElement textAlignment="Right"> 
        <font fontName="Helvetica" size="12" isBold="true"/> 
       </textElement> 
       <textFieldExpression><![CDATA[$F{userEmail}]]></textFieldExpression> 
      </textField> 
     </band> 
    </title> 
</jasperReport> 

NOTA: debe definir el los elementos del campo primero, antes de que se puedan usar. Deberían ser la ruta JSON desde la raíz del archivo de entrada JSON utilizando la notación de puntos estándar. Ver los elementos de descripción de campo arriba para ejemplos.

Una vez definido su campo puede utilizar su valor calculado en un campo de texto o lo que sea:

esperanza de que ayuda a algunas personas.

+2

¿Qué pasa con las matrices de objetos. ¿Cómo los manejas? Especialmente para colocarlos en los detalles de la banda? – Yebach

+0

Lo siento, dejé de trabajar con los informes de Jasper no mucho después de esta publicación, así que no tengo ni idea. –

1

Esto es cómo manejar arrays JSON en Jasper

Digamos que quiero informar de la siguiente matriz.

[ 
    {"name":"Jerry", "value":"Jesus"}, 
    {"name":"Gideon", "value": "Loves"}, 
    {"name":"Eva", "value": "You"} 
] 

Al diseñar el informe, asegúrese de que el nombre de los campos exactamente el mismo nombre que el nombre del campo JSON. Entonces en el diseñador agregaría dos campos llamados nombre y valor. Incluso puede agregar tantos parámetros al diseñador de informes como sea necesario. Para este ejemplo, agregaré un parámetro llamado title en Jasper Studio.

Ahora aquí está el código de java que creará el informe de jaspe basado en esta matriz de prueba. Codificaré con fuerza los datos json en el código, pero puede cargar desde el archivo o lo que crea que es mejor. Comenté el código para explicar lo que está sucediendo.

import net.sf.jasperreports.engine.export.JRHtmlExporterParameter; 
import net.sf.jasperreports.engine.export.JRXlsExporterParameter; 
import net.sf.jasperreports.engine.export.JRHtmlExporter; 
import net.sf.jasperreports.engine.export.JRXlsExporter; 
import net.sf.jasperreports.engine.data.JsonDataSource; 
import net.sf.jasperreports.engine.JRExporterParameter; 
import net.sf.jasperreports.engine.JasperExportManager; 
import net.sf.jasperreports.engine.JasperFillManager; 
import net.sf.jasperreports.engine.util.JRLoader; 
import net.sf.jasperreports.engine.JasperReport; 
import net.sf.jasperreports.engine.JRException; 
import net.sf.jasperreports.engine.JasperPrint; 
import org.apache.commons.codec.binary.Base64; 
import java.util.HashMap; 
import java.util.Locale; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 
import java.io.*; 

//Class Name. This must match the class name you put in your build.gradle file 
public class JasperPDFExample { 
public static void main(String[] args) { 
    try { 
    try { 
    //Our json object. This can be loaded from file 
    String rawJsonData = "[{\"name\":\"Jerry\", \"value\":\"Jesus\"}," 
         + "{\"name\":\"Gideon\", \"value\": \"Loves\"}," 
         + "{\"name\":\"Eva\", \"value\": \"You\"}" 
         + "]"; 
    //Load compiled jasper report that we created on first section. 
    JasperReport report = (JasperReport) JRLoader.loadObject(new File("/home/jerry/Sample.jasper")); 
    //Convert json string to byte array. 
    ByteArrayInputStream jsonDataStream = new ByteArrayInputStream(rawJsonData.getBytes()); 
    //Create json datasource from json stream 
    JsonDataSource ds = new JsonDataSource(jsonDataStream); 
    //Create HashMap to add report parameters 
    Map parameters = new HashMap(); 
    //Add title parameter. Make sure the key is same name as what you named the parameter in jasper report. 
    parameters.put("title", "Jasper PDF Example"); 
    //Create Jasper Print object passing report, parameter json data source. 
    JasperPrint jasperPrint = JasperFillManager.fillReport(report, parameters, ds); 
    //Export and save pdf to file 
    JasperExportManager.exportReportToPdfFile(jasperPrint,"/home/jerry/jasperpdfexample.pdf"); 
    } catch (JRException ex) { 
    ex.printStackTrace(); 
    throw new RuntimeException(ex); 
    } catch (Exception ex) { 
    ex.printStackTrace(); 
    throw new RuntimeException(ex); 
    } 
    } catch (Exception ex) { 
    ex.printStackTrace(); 
    throw new RuntimeException(ex); 
    } 
} 
} 

Gracias a https://mis.io/pub/how-to-create-a-jasper-pdf-report-from-a-json-datasource-in-java/ que era capaz de conseguir que esto funcione junto con la creación de java para Jasper usando herramienta de construcción Gradle.