ZetCode

JasperReports Map 数据源

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

在本文中,我们将展示如何在 JasperReports 库中使用 JRMapArrayDataSource 和 JRMapCollectionDataSource 作为数据源。

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

JasperReports 有两种数据源可以处理 Map 数据。JRMapArrayDataSource 是一个包含 Map 数组数据的数据源。JRMapCollectionDataSource 是一个包含 Map 列表数据的数据源。

JasperReports Map 数据源示例

在下面的示例中,我们将从 Map 对象集合/数组生成报告。

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.Integer">
        <fieldDescription><![CDATA[id]]></fieldDescription>
    </field>

    <field name="name">
        <fieldDescription><![CDATA[name]]></fieldDescription>
    </field>

    <field name="occupation">
        <fieldDescription><![CDATA[occupation]]></fieldDescription>
    </field>

    <detail>
        <band height="20">
            <textField>
                <reportElement x="0" y="0" width="50" height="20"/>
                <textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
            </textField>

            <textField>
                <reportElement x="70" y="0" width="80" height="20"/>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>

            <textField>
                <reportElement x="170" y="0" width="80" height="20"/>
                <textFieldExpression><![CDATA[$F{occupation}]]></textFieldExpression>
            </textField>

        </band>
    </detail>

</jasperReport>

报表模板使用三个字段:idnameoccupation

report.gvy
package com.zetcode

@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.JasperExportManager
import net.sf.jasperreports.engine.JasperFillManager
import net.sf.jasperreports.engine.data.JRMapCollectionDataSource

def users = [
    ['id': 1, 'name': 'John Doe', 'occupation': 'gardener'],
    ['id': 2, 'name': 'Roger Roe', 'occupation': 'driver'],
    ['id': 3, 'name': 'Jane Doe', 'occupation': 'teacher'],
    ['id': 4, 'name': 'Tomas Mudry', 'occupation': 'shopkeeper'],
    ['id': 5, 'name': 'Paul Smith', 'occupation': 'programmer'],
    ['id': 6, 'name': 'Roman Nikolaj', 'occupation': 'programmer'],
    ['id': 7, 'name': 'Lucia Smutna', 'occupation': 'student'],
    ['id': 8, 'name': 'Kevin Smith', 'occupation': 'manager'],
]

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

def ds = new JRMapCollectionDataSource(users)

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

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

本示例使用 JRMapCollectionDataSource 作为数据源。

def users = [
    ['id': 1, 'name': 'John Doe', 'occupation': 'gardener'],
    ['id': 2, 'name': 'Roger Roe', 'occupation': 'driver'],
    ['id': 3, 'name': 'Jane Doe', 'occupation': 'teacher'],
    ['id': 4, 'name': 'Tomas Mudry', 'occupation': 'shopkeeper'],
    ['id': 5, 'name': 'Paul Smith', 'occupation': 'programmer'],
    ['id': 6, 'name': 'Roman Nikolaj', 'occupation': 'programmer'],
    ['id': 7, 'name': 'Lucia Smutna', 'occupation': 'student'],
    ['id': 8, 'name': 'Kevin Smith', 'occupation': 'manager'],
]

我们定义了一个 Map 列表。每个 Map 代表用户数据。idnameoccupation 键映射到模板字段。

def ds = new JRMapCollectionDataSource(users)

从 Map 对象列表中,我们创建了 JRMapCollectionDataSource

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

数据源被传递给 JasperFillManager.fillReport 方法。


Map[] users = [
    ['id': 1, 'name': 'John Doe', 'occupation': 'gardener'],
    ['id': 2, 'name': 'Roger Roe', 'occupation': 'driver'],
    ['id': 3, 'name': 'Jane Doe', 'occupation': 'teacher'],
    ['id': 4, 'name': 'Tomas Mudry', 'occupation': 'shopkeeper'],
    ['id': 5, 'name': 'Paul Smith', 'occupation': 'programmer'],
    ['id': 6, 'name': 'Roman Nikolaj', 'occupation': 'programmer'],
    ['id': 7, 'name': 'Lucia Smutna', 'occupation': 'student'],
    ['id': 8, 'name': 'Kevin Smith', 'occupation': 'Manager'],
]

def ds = new JRMapArrayDataSource(users)

或者,我们也可以使用 JRMapArrayDataSource,它接受一个 Map 数组。

在本文中,我们在 JasperReports 库中使用了 JRMapArrayDataSource 和 JRMapCollectionDataSource 作为数据源。

作者

我叫 Jan Bodnar,我是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有超过十年的经验。

列出 所有 JasperReports 教程