2012-07-18 10 views
13

JRBeanCollectionDataSourceを使用してJasperレポート(PDF、Excel、Csv)を作成すると問題ありません。これは、.jrxmlファイルが、レポートを処理するための入力としてpojoのコレクションを受け入れることを意味します。JSONオブジェクトまたはJSONストリングからJasperレポートPDFフォームを作成

今、JSONオブジェクトから同じ.jrxmlでジャスパーレポートを作成しようとしています。いずれかが私を助けることができる は、私は次のことを試みたが、すべての値は、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"); 

にnullの?

+0

これはこれまでに実現しましたか?私は今同じことをしようとしています – Marianna

答えて

18

私はJasper ReportのDataSourceとしてJSONを使用することに苦労していますが、ネット上でまともな例がないため、今後の参考としてここに掲載する予定です。

この例は、iReport DesignerとJSON DataSourceを使用する方法です。

まず

、入力JSON:あなたが使用することができます

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

その後iReportはデザイナーでJSONデータソースを作成し、あなたのファイルでそれを指す(そのデフォルトとして他のすべての詳細を残して)

次レポートに上記のJSONをレンダリングするjrxmlテンプレートを次

<?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> 

注:あなたが定義する必要がありますそれらが使用される前に、まずフィールド要素を使用します。標準のドット表記を使用してJSON入力ファイルのルートからのJSONパスにする必要があります。例については、上のfieldDescription要素を参照してください。何人かの人々を助け

希望:あなたのフィールドは、あなたがその計算されたテキストフィールドに値または何を使用することができます定義されると

+2

オブジェクトの配列はどうですか?あなたはどうやってそれらを扱いますか?特に彼らを詳細なバンドに置くには? – Yebach

+0

申し訳ありませんが、この投稿の後のほんの一部ではありませんので、ジャスパー・レポートを使って作業をやめました。 –

1

これは私が碧玉

にJSON配列を処理する方法であるが、私は次の配列をオフ報告したいとしましょう。

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

レポートをデザインするときは、フィールドにjsonフィールド名と同じ名前を付けてください。だからデザイナーでは、という名前のフィールドの値をと2つ追加します。必要に応じて、レポートデザイナに多くのパラメータを追加することもできます。この例では、というタイトルのをJasper Studioに追加します。

ここに、このテスト配列に基づいてジャスパーレポートを作成するJavaコードを示します。私はコード内のjsonデータをハードコードしますが、あなたが気に入っているファイルやファイルから読み込むことができます。私は何が起こっているのかを説明するコードにコメントしました。 https://mis.io/pub/how-to-create-a-jasper-pdf-report-from-a-json-datasource-in-java/

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

おかげで私は、これはGradleのビルドツールを使用して碧玉のためのJavaのセットアップと一緒に仕事を得ることができました。

関連する問題