ZetCode

JasperReports 变量

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

JasperReports 变量教程展示了如何在 JasperReports 库中创建变量。

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

JasperReports 变量

一个 变量 用于存储中间结果,并对从数据源提取的数据进行复杂计算。它们可以在报表的其他部分使用,包括其他变量。我们使用 $V{var_name} 语法来引用变量。

变量使用 <variable> 标签定义。用于计算变量的表达式在 <variableExpression> 标签中定义。在表达式内部,我们可以使用函数、运算符、字段或其他变量。JasperReports 包含一些内置变量,例如 PAGE_NUMBERCOLUMN_NUMERREPORT_COUNT

JasperReports 变量示例

下面的应用程序创建了一个求和变量,它对汽车价格进行求和。

pom.xml
src
└───main
    ├───java
    │   └───com
    │       └───zetcode
    │           ├───main
    │           │       CommandLineRunner.java
    │           │       JasperVariableSum.java
    │           └───model
    │                   Car.java
    └───resources
            report2.xml

这是项目结构。

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
         http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.zetcode</groupId>
    <artifactId>sumex</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
        <exec.mainClass>com.zetcode.main.CommandLineRunner</exec.mainClass>
    </properties>

    <dependencies>

        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports</artifactId>
            <version>6.9.0</version>
        </dependency>

        <dependency>
            <groupId>net.sf.jasperreports</groupId>
            <artifactId>jasperreports-fonts</artifactId>
            <version>6.9.0</version>
        </dependency>

    </dependencies>

</project>

Maven 的 pom.xml 文件包含 jasperreportsjasperreports-fonts 依赖项。因为我们在数字显示中使用粗体,所以需要字体。

com/zetcode/model/Car.java
package com.zetcode.model;

public class Car {

    private Long id;
    private String name;
    private int price;

    public Car() {}

    public Car(Long id, String name, int price) {
        this.id = id;
        this.name = name;
        this.price = price;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPrice() {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Car{");
        sb.append("id=").append(id);
        sb.append(", name='").append(name).append('\'');
        sb.append(", price=").append(price);
        sb.append('}');
        return sb.toString();
    }
}

这是 Car bean 类。它包含汽车 ID、汽车名称和汽车价格属性。

src/resources/report2.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="report2" topMargin="20" bottomMargin="20">

    <style name="sum" isBold="true"/>

    <field name="Price" class="java.lang.Integer">
        <fieldDescription><![CDATA[price]]></fieldDescription>
    </field>

    <variable name="sum" class="java.lang.Integer" calculation="Sum">
        <variableExpression><![CDATA[$F{Price}]]></variableExpression>
    </variable>

    <columnHeader>
        <band height="20">
            <staticText>
                <reportElement x="0" y="0" width="100" height="20"/>
                <box leftPadding="10"/>
                <textElement textAlignment="Center"/>
                <text><![CDATA[Car price]]></text>
            </staticText>
        </band>
    </columnHeader>

    <detail>
        <band height="20">
            <textField>
                <reportElement x="0" y="0" width="100" height="20" />
                <textElement textAlignment="Right"/>
                <textFieldExpression class="java.lang.Integer"><![CDATA[$F{Price}]]></textFieldExpression>
            </textField>
        </band>
    </detail>

    <summary>
        <band height="20">
            <textField>
                <reportElement style="sum" x="0" y="0" width="100" height="20"/>
                <textElement textAlignment="Right"/>

                <textFieldExpression class="java.lang.Long"><![CDATA[$V{sum}]]></textFieldExpression>
            </textField>
        </band>
    </summary>

</jasperReport>

这是报表模板文件。模板包含列标题和详细信息带。

<style name="sum" isBold="true"/>

我们为求和定义了一个样式;它以粗体字体渲染。

<field name="Price" class="java.lang.Integer">
    <fieldDescription><![CDATA[price]]></fieldDescription>
</field>

Price 字段映射到汽车的 price 属性。在此示例中,我们只显示汽车价格。

<variable name="sum" class="java.lang.Integer" calculation="Sum">
    <variableExpression><![CDATA[$F{Price}]]></variableExpression>
</variable>

我们定义了 sum 变量。calculation 属性定义了应用于变量表达式的函数。在我们的例子中,我们有 $F{Price},它返回数据源中的价格字段。

<summary>
    <band height="20">
        <textField>
            <reportElement style="sum" x="0" y="0" width="100" height="20"/>
            <textElement textAlignment="Right"/>

            <textFieldExpression class="java.lang.Long"><![CDATA[$V{sum}]]></textFieldExpression>
        </textField>
    </band>
</summary> 

我们使用 $V{sum} 语法在摘要带中显示求和变量。

com/zetcode/main/JasperVariableSum.java
package com.zetcode.main;

import com.zetcode.model.Car;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import java.util.ArrayList;
import java.util.HashMap;

public class JasperVariableSum {

    public void start() throws JRException {

        var cars = new ArrayList<Car>();

        cars.add(new Car(1L, "Audi", 52642));
        cars.add(new Car(2L, "Mercedes", 57127));
        cars.add(new Car(3L, "Skoda", 9000));
        cars.add(new Car(4L, "Volvo", 29000));
        cars.add(new Car(5L, "Bentley", 350000));
        cars.add(new Car(6L, "Citroen", 21000));
        cars.add(new Car(7L, "Hummer", 41400));
        cars.add(new Car(8L, "Volkswagen", 21600));

        var ds = new JRBeanCollectionDataSource(cars);

        var xmlFile = "src/main/resources/report2.xml";
        var jasperReport = JasperCompileManager.compileReport(xmlFile);

        var params = new HashMap<String, Object>();
        var jasperPrint = JasperFillManager.fillReport(jasperReport,
                params, ds);

        JasperExportManager.exportReportToPdfFile(jasperPrint,
                "src/main/resources/report2.pdf");
    }
}

示例中的数据源是 Java bean 的集合。

com/zetcode/main/CommandLineRunner.java
package com.zetcode.main;

import net.sf.jasperreports.engine.JRException;

public class CommandLineRunner {

    public static void main(String[] args) throws JRException {

        var app = new JasperVariableSum();
        app.start();
    }
}

CommandLineRunner 设置应用程序。

$ mvn exec:java

我们运行应用程序。

在本文中,我们创建了一个求和变量来计算汽车价格的总和。

作者

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

列出 所有 JasperReports 教程