JasperReports 变量
最后修改日期:2024 年 2 月 12 日
JasperReports 变量教程展示了如何在 JasperReports 库中创建变量。
JasperReports 是一个开源报告库。它可以创建各种格式的报告,包括 PDF、HTML、XLS 或 CSV。JasperReports 创建面向页面、可直接打印的文档。
JasperReports 变量
一个 变量 用于存储中间结果,并对从数据源提取的数据进行复杂计算。它们可以在报表的其他部分使用,包括其他变量。我们使用 $V{var_name}
语法来引用变量。
变量使用 <variable>
标签定义。用于计算变量的表达式在 <variableExpression>
标签中定义。在表达式内部,我们可以使用函数、运算符、字段或其他变量。JasperReports 包含一些内置变量,例如 PAGE_NUMBER
、COLUMN_NUMER
或 REPORT_COUNT
。
JasperReports 变量示例
下面的应用程序创建了一个求和变量,它对汽车价格进行求和。
pom.xml src └───main ├───java │ └───com │ └───zetcode │ ├───main │ │ CommandLineRunner.java │ │ JasperVariableSum.java │ └───model │ Car.java └───resources report2.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
文件包含 jasperreports
和 jasperreports-fonts
依赖项。因为我们在数字显示中使用粗体,所以需要字体。
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、汽车名称和汽车价格属性。
<?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}
语法在摘要带中显示求和变量。
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 的集合。
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
我们运行应用程序。
在本文中,我们创建了一个求和变量来计算汽车价格的总和。