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 库从中创建报告。
<?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 属性。
@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 创建了一个数据适配器。
<?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
创建。
<?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
属性设置数据适配器。
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 文件报告。