ZetCode

JasperReports JSON

最后修改日期:2024 年 2 月 12 日

JasperReports JSON 教程展示了如何在 JasperReports 库中使用 JSON 数据。

JasperReports 是一个开源报告库。它可以创建各种格式的报告,包括 PDF、HTML、XLS 或 CSV。JasperReports 创建面向页面、可直接打印的文档。

JsonDataSource 是 JSON 数据的数据源。JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。它易于人类阅读和编写,也易于机器解析和生成。JSON 的官方 Internet 媒体类型是 application/json。JSON 文件名扩展名是 .json

JasperReports JSON 示例

下面的应用程序从在线测试服务读取 JSON 数据,并使用 JasperReports 库从中创建报告。

report.xml
<?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">

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

这是报告模板文件。模板包含详细信息部分,其中每个元素都会为数据源提供的每条记录重复一次。

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

我们有三个字段。这些字段会自动映射到 JSON 属性。

report.gvy
@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0')
@Grab(group='com.github.librepdf', module='openpdf', version='1.3.39')

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

在此示例中,我们从 JsonDataSource 获取数据。

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

我们创建了到指定 URL 的输入流。然后将输入流传递给 JsonDataSource

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

创建的数据源被传递给 JasperFillManager.fillReport

JasperReports JSON 数据适配器示例

在第二个示例中,我们为 JSON 创建了一个数据适配器。

json-adapter.xml
<?xml version="1.0" encoding="UTF-8"?>
<jsonDataAdapter class="net.sf.jasperreports.data.json.JsonDataAdapterImpl">
    <name>json-adapter</name>
    <dataFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="httpDataLocation">
          <url>https://jsonplaceholder.typicode.com/users</url>
    </dataFile>

    <language>json</language>
    <useConnection>false</useConnection>
    <timeZone xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com" xsi:type="java:java.lang.String">Europe/Prague</timeZone>
    <locale xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:java="http://java.sun.com" xsi:type="java:java.lang.String">en_US</locale>
    <selectExpression></selectExpression>

</jsonDataAdapter>

JSON 的数据适配器使用 jsonDataAdapter 创建。

report.xml
<?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">

    <property name="net.sf.jasperreports.data.adapter" value="json-adapter.xml"/>

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

这是模板文件。

<property name="net.sf.jasperreports.data.adapter" value="json-adapter.xml"/>

使用 net.sf.jasperreports.data.adapter 属性设置数据适配器。

report.gvy
package com.zetcode

@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0')
@Grab(group='org.apache.httpcomponents', module='httpclient', version='4.5.13')
@Grab(group='com.github.librepdf', module='openpdf', version='1.3.39')

import net.sf.jasperreports.engine.JasperCompileManager
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.JasperExportManager
import net.sf.jasperreports.engine.JREmptyDataSource

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

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

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

Groovy 文件仅用于生成报告。由于 JasperReports 在内部使用 Apache HTTP 客户端,因此我们添加了必要的依赖项。

在本文中,我们已从 JSON 数据创建了 PDF 文件报告。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在教授编程方面拥有十多年的经验。

列出 所有 JasperReports 教程