web-dev-qa-db-ja.com

JSONオブジェクトまたはJSON文字列からJasperReport PDFフォームを作成する

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

今、私は同じ.jrxmlを使用してJSONオブジェクトからjasperレポートを作成しようとしています。以下を試しましたが、PDFレポートではすべての値がnullです

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

誰か助けてもらえますか?

13
Peer Mohamed

ジャスパーレポートのデータソースとしてJSONを使用するのに苦労していて、ネット上に適切な例がないため、今後の参考のためにここに投稿すると思いました。

この例は、iReportDesignerとJSONデータソースの使用方法です。

まず、入力JSON:

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

次に、iReport DesignerでJSONデータソースを作成し、ファイルをポイントします(他のすべての詳細はデフォルトのままにします)

次に、次のjrxmlテンプレートを使用して、上記のJSONをレポートにレンダリングできます。

<?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要素を参照してください。

フィールドが定義されると、その計算値をテキストフィールドなどで使用できます。

それが何人かの人々を助けることを願っています。

19
pmckeown

これは私がジャスパーでjson配列を処理する方法です

次の配列からレポートしたいとしましょう。

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

レポートを設計するときは、フィールドにjsonフィールド名とまったく同じ名前を付けるようにしてください。したがって、デザイナーでは、namevalueという2つのフィールドを追加します。必要な数のパラメーターをレポートデザイナーに追加することもできます。この例では、Jasper Studioにtitleというパラメーターを追加します。

これがJavaこのテスト配列に基づいてジャスパーレポートを作成するコードです。コードにjsonデータをハードコーディングしますが、ファイルまたは好きなものからロードできます。何が起こっているのかを説明するためにコードにコメントしました。

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

おかげで https://mis.io/pub/how-to-create-a-jasper-pdf-report-from-a-json-datasource-in-Java/ 私は得ることができましたこれは、gradleビルドツールを使用してジャスパー用にJavaを設定することと連動します。

4
jerry