14

使用 JRBeanCollectionDataSource 创建 Jasper 报告(PDF、Excel、Csv)时很好。这意味着 .jrxml 文件接受 pojo 的集合作为处理报告的输入。

现在,我一直在尝试使用相同的 .jrxml 但来自 JSON 对象创建碧玉报告。我尝试了以下方法,但 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");

谁能帮我?

4

3 回答 3

20

我一直在努力使用 JSON 作为 Jasper 报告的数据源,并且由于网络上缺乏像样的示例,我想我会在此处发布此内容以供将来参考。

这个例子是如何使用 iReport 设计器和一个 JSON 数据源。

首先,输入 JSON:

{ 
    "userName": "Evil Raat",
    "details": {
        "email": "not_really@test.com"
    }
}

然后在 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 元素。

定义字段后,您可以在文本字段或其他任何内容中使用其计算值:

希望对一些人有所帮助。

于 2013-03-20T08:24:26.267 回答
7

这就是我在 jasper 中处理 json 数组的方式

假设我想报告以下数组。

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

设计报告时,请确保将字段命名为与 json 字段名称完全相同的名称。所以在设计器中我会添加两个字段,分别称为namevalue。您甚至可以根据需要向报表设计器添加任意数量的参数。对于这个例子,我将在 Jasper Studio 中添加一个名为title的参数。

现在这里是 java 代码,它将基于这个测试数组创建 jasper 报告。我将在代码中对 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/我能够让它与设置一起工作java for jasper 使用 gradle 构建工具。

于 2017-09-20T05:36:44.140 回答
0

如果你在 Java 中这样做,你会在自己的脚下开枪。

Groovy 示例要简单得多:

@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.17.0')

import net.sf.jasperreports.engine.JasperCompileManager
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.JasperExportManager
import net.sf.jasperreports.engine.data.JsonDataSource

def xmlFile = "report.xml"
def jrReport = JasperCompileManager.compileReport(xmlFile)

def url = 'https://jsonplaceholder.typicode.com/users'
def is = new URL(url).openStream()
def ds = new JsonDataSource(is)

def params = [:]
def jrPrint = JasperFillManager.fillReport(jrReport, params, ds)

JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")

报告模板:

<?xml version = "1.0" encoding = "UTF-8"?>
<!DOCTYPE jasperReport PUBLIC "//JasperReports//DTD Report Design//EN"
        "http://jasperreports.sourceforge.net/dtds/jasperreport.dtd">

<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="report" topMargin="20" bottomMargin="20">

    <queryString language="json">
        <![CDATA[]]>
    </queryString>

    <field name="id" class="java.lang.Long"/>
    <field name="name"/>
    <field name="username"/>

    <detail>
        <band height="15">

            <textField>
                <reportElement x="0" y="0" width="50" height="15"/>
                <textElement textAlignment="Right" verticalAlignment="Middle"/>
                <textFieldExpression class="java.lang.Long">
                    <![CDATA[$F{id}]]>
                </textFieldExpression>
            </textField>

            <textField>
                <reportElement x="70" y="0" width="100" height="15" />

                <textElement textAlignment="Left" verticalAlignment="Middle"/>
                <textFieldExpression>
                    <![CDATA[$F{name}]]>
                </textFieldExpression>
            </textField>

            <textField>
                <reportElement x="190" y="0" width="100" height="15" />
                <textElement textAlignment="Right" verticalAlignment="Middle"/>
                <textFieldExpression>
                    <![CDATA[$F{username}]]>
                </textFieldExpression>
            </textField>

        </band>
    </detail>

</jasperReport>

在示例中,我们从流行的 API 测试网站https://jsonplaceholder.typicode.com/users获取数据,并选择三个字段显示在我们的报告中。

运行$ groovy report.gvy

于 2021-12-07T17:41:51.583 回答