JasperReports 分组
最后修改日期:2024 年 2 月 12 日
JasperReports 中的分组有助于构建数据结构。它由一个包含字段和变量的表达式定义,这些字段和变量定义了包含在该组中的标准。
JasperReports 是一个开源报告库。它可以创建各种格式的报告,包括 PDF、HTML、XLS 或 CSV。JasperReports 创建面向页面、可直接打印的文档。
报表组有三个元素
- 分组表达式 - 指示必须更改以开始新数据组的数据
- 组头 - 在分组数据的开头放置标签
- 组尾 - 在分组数据的末尾放置标签
页眉和/或页脚是可选的。
这些是组属性
- name - 通过名称在报表表达式中引用组
- isStartNewColumn - 每个数据组在新列开始
- isStartNewPage - 每个数据组在新页面开始
- isResetPageNumber - 每次新组开始时重置报表页码
- isReprintHeaderOnEachPage - 组头将在每页上重印
- minHeightToStartNewPage - 定义在列底部放置组头所需的最小垂直空间量;该量以报表单位指定。
- footerPosition - 渲染组页脚在页面上的位置,以及它与后面报表部分的相对行为(Normal、StackAtBottom、ForceAtBottom 和 CollateAtBottom。默认值为 Normal)
- keepTogether - 防止组在第一次中断尝试时拆分
JasperReports 分组数据示例
该示例将汽车分为两组:自动变速箱和手动变速箱。为了正确输出,数据必须已排序。当我们创建一个新组时,会创建一个新的 GROUPNAME_COUNT
变量;在我们的例子中是 am_group_COUNT
。
cars.csv
"name","mpg","cyl","disp","hp","drat","wt","qsec","vs","am","gear","carb" "Mazda RX4",21,6,160,110,3.9,2.62,16.46,0,1,4,4 "Mazda RX4 Wag",21,6,160,110,3.9,2.875,17.02,0,1,4,4 "Datsun 710",22.8,4,108,93,3.85,2.32,18.61,1,1,4,1 "Hornet 4 Drive",21.4,6,258,110,3.08,3.215,19.44,1,0,3,1 "Hornet Sportabout",18.7,8,360,175,3.15,3.44,17.02,0,0,3,2 "Valiant",18.1,6,225,105,2.76,3.46,20.22,1,0,3,1 "Duster 360",14.3,8,360,245,3.21,3.57,15.84,0,0,3,4 "Merc 240D",24.4,4,146.7,62,3.69,3.19,20,1,0,4,2 "Merc 230",22.8,4,140.8,95,3.92,3.15,22.9,1,0,4,2 "Merc 280",19.2,6,167.6,123,3.92,3.44,18.3,1,0,4,4 "Merc 280C",17.8,6,167.6,123,3.92,3.44,18.9,1,0,4,4 "Merc 450SE",16.4,8,275.8,180,3.07,4.07,17.4,0,0,3,3 "Merc 450SL",17.3,8,275.8,180,3.07,3.73,17.6,0,0,3,3 "Merc 450SLC",15.2,8,275.8,180,3.07,3.78,18,0,0,3,3 "Cadillac Fleetwood",10.4,8,472,205,2.93,5.25,17.98,0,0,3,4 "Lincoln Continental",10.4,8,460,215,3,5.424,17.82,0,0,3,4 "Chrysler Imperial",14.7,8,440,230,3.23,5.345,17.42,0,0,3,4 "Fiat 128",32.4,4,78.7,66,4.08,2.2,19.47,1,1,4,1 "Honda Civic",30.4,4,75.7,52,4.93,1.615,18.52,1,1,4,2 "Toyota Corolla",33.9,4,71.1,65,4.22,1.835,19.9,1,1,4,1 "Toyota Corona",21.5,4,120.1,97,3.7,2.465,20.01,1,0,3,1 "Dodge Challenger",15.5,8,318,150,2.76,3.52,16.87,0,0,3,2 "AMC Javelin",15.2,8,304,150,3.15,3.435,17.3,0,0,3,2 "Camaro Z28",13.3,8,350,245,3.73,3.84,15.41,0,0,3,4 "Pontiac Firebird",19.2,8,400,175,3.08,3.845,17.05,0,0,3,2 "Fiat X1-9",27.3,4,79,66,4.08,1.935,18.9,1,1,4,1 "Porsche 914-2",26,4,120.3,91,4.43,2.14,16.7,0,1,5,2 "Lotus Europa",30.4,4,95.1,113,3.77,1.513,16.9,1,1,5,2 "Ford Pantera L",15.8,8,351,264,4.22,3.17,14.5,0,1,5,4 "Ferrari Dino",19.7,6,145,175,3.62,2.77,15.5,0,1,5,6 "Maserati Bora",15,8,301,335,3.54,3.57,14.6,0,1,5,8 "Volvo 142E",21.4,4,121,109,4.11,2.78,18.6,1,1,4,2
这是 cars.csv
文件。
这些是列名描述
- mpg - 每加仑英里数(美国)
- cyl - 气缸数
- disp - 排量(立方英寸)
- hp - 马力
- dtrat - 齿轮比
- wt - 重量(千磅)
- qsec - 1/4 英里加速时间
- vs - 发动机(0 - V型,1 - 直列型)
- am - 变速器(0 - 自动,1 - 手动)
- gear - 前进档位数
- carb - 化油器数
report.xml
<?xml version="1.0" encoding="UTF-8"?> <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" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20"> <field name="name" class="java.lang.String"/> <field name="mpg" class="java.lang.Double"/> <field name="cyl" class="java.lang.Integer"/> <field name="disp" class="java.lang.Double"/> <field name="hp" class="java.lang.Integer"/> <field name="drat" class="java.lang.Double"/> <field name="wt" class="java.lang.Double"/> <field name="qsec" class="java.lang.Double"/> <field name="vs" class="java.lang.Integer"/> <field name="am" class="java.lang.Integer"/> <field name="gear" class="java.lang.Integer"/> <field name="carb" class="java.lang.Integer"/> <sortField name="am"/> <group name="am_group" isStartNewPage="true" isReprintHeaderOnEachPage="true"> <groupExpression><![CDATA[$F{am}]]></groupExpression> <groupHeader> <band height="42"> <textField> <reportElement x="0" y="5" width="100" height="30"/> <textElement> <font isBold="true"/> </textElement> <textFieldExpression><![CDATA[ $F{am} == 0 ? "Automatic" : "Manual" ]]></textFieldExpression> </textField> <line direction="BottomUp"> <reportElement x="0" y="21" width="569" height="1"> <printWhenExpression><![CDATA[$V{COLUMN_COUNT} == $V{am_group_COUNT}]]></printWhenExpression> </reportElement> </line> </band> </groupHeader> <groupFooter> <band height="52"> <textField> <reportElement x="0" y="11" width="100" height="30"/> <textElement> <font isBold="true"/> </textElement> <textFieldExpression><![CDATA[$V{am_group_COUNT}]]></textFieldExpression> </textField> </band> </groupFooter> </group> <columnHeader> <band height="44" splitType="Stretch"> <staticText> <reportElement x="0" y="0" width="49" height="30"/> <text><![CDATA[name]]></text> </staticText> <staticText> <reportElement x="58" y="0" width="40" height="30"/> <text><![CDATA[mpg]]></text> </staticText> <staticText> <reportElement x="104" y="0" width="46" height="30"/> <text><![CDATA[cyl]]></text> </staticText> <staticText> <reportElement x="150" y="0" width="38" height="30"/> <text><![CDATA[disp]]></text> </staticText> <staticText> <reportElement x="198" y="0" width="46" height="30"/> <text><![CDATA[hp]]></text> </staticText> <staticText> <reportElement x="244" y="0" width="46" height="30"/> <text><![CDATA[drat]]></text> </staticText> <staticText> <reportElement x="290" y="0" width="46" height="30"/> <text><![CDATA[wt]]></text> </staticText> <staticText> <reportElement x="340" y="0" width="64" height="30"/> <text><![CDATA[qsec]]></text> </staticText> <staticText> <reportElement x="410" y="0" width="20" height="30"/> <text><![CDATA[vs]]></text> </staticText> <staticText> <reportElement x="450" y="0" width="26" height="30"/> <text><![CDATA[am]]></text> </staticText> <staticText> <reportElement x="490" y="0" width="32" height="30"/> <text><![CDATA[gear]]></text> </staticText> <staticText> <reportElement x="530" y="0" width="38" height="30"/> <text><![CDATA[carb]]></text> </staticText> </band> </columnHeader> <detail> <band height="49" splitType="Stretch"> <textField> <reportElement x="0" y="0" width="49" height="30"/> <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression> </textField> <textField> <reportElement x="58" y="0" width="46" height="30"/> <textFieldExpression><![CDATA[$F{mpg}]]></textFieldExpression> </textField> <textField> <reportElement x="104" y="0" width="46" height="30"/> <textFieldExpression><![CDATA[$F{cyl}]]></textFieldExpression> </textField> <textField> <reportElement x="150" y="0" width="38" height="30"/> <textFieldExpression><![CDATA[$F{disp}]]></textFieldExpression> </textField> <textField> <reportElement x="198" y="0" width="46" height="30"/> <textFieldExpression><![CDATA[$F{hp}]]></textFieldExpression> </textField> <textField> <reportElement x="244" y="0" width="46" height="30"/> <textFieldExpression><![CDATA[$F{drat}]]></textFieldExpression> </textField> <textField> <reportElement x="290" y="0" width="46" height="30"/> <textFieldExpression><![CDATA[$F{wt}]]></textFieldExpression> </textField> <textField> <reportElement x="340" y="0" width="64" height="30"/> <textFieldExpression><![CDATA[$F{qsec}]]></textFieldExpression> </textField> <textField> <reportElement x="410" y="0" width="20" height="30"/> <textFieldExpression><![CDATA[$F{vs}]]></textFieldExpression> </textField> <textField> <reportElement x="450" y="0" width="26" height="30"/> <textFieldExpression><![CDATA[$F{am}]]></textFieldExpression> </textField> <textField> <reportElement x="490" y="0" width="32" height="30"/> <textFieldExpression><![CDATA[$F{gear}]]></textFieldExpression> </textField> <textField> <reportElement x="530" y="0" width="38" height="30"/> <textFieldExpression><![CDATA[$F{carb}]]></textFieldExpression> </textField> </band> </detail> </jasperReport>
这是报表模板文件。
<group name="am_group" isStartNewPage="true" isReprintHeaderOnEachPage="true"&gr;
定义了 am_group
组。
<groupExpression><![CDATA[$F{am}]]></groupExpression>
数据通过 $F{am}
字段分为两组。
<textField> <reportElement x="0" y="5" width="100" height="30"/> <textElement> <font isBold="true"/> </textElement> <textFieldExpression><![CDATA[ $F{am} == 0 ? "Automatic" : "Manual" ]]></textFieldExpression> </textField> <line direction="BottomUp"> <reportElement x="0" y="21" width="569" height="1"> <printWhenExpression><![CDATA[$V{COLUMN_COUNT} == $V{am_group_COUNT}]]></printWhenExpression> </reportElement> </line>
在组头中,我们有描述和一条水平线。该线仅在新组开始时显示;即显示两次。
<textField> <reportElement x="0" y="11" width="100" height="30"/> <textElement> <font isBold="true"/> </textElement> <textFieldExpression><![CDATA[$V{am_group_COUNT}]]></textFieldExpression> </textField>
在组尾中,我们显示该特定组的项目数量。我们利用 am_group_COUNT
变量。
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.JRCsvDataSource def xmlFile = "report.xml" def jrReport = JasperCompileManager.compileReport(xmlFile) def fileName = "cars.csv" def ds = new JRCsvDataSource(fileName) ds.setUseFirstRowAsHeader(true) def params = [:] def jrPrint = JasperFillManager.fillReport(jrReport, params, ds) JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")
我们使用 JRCsvDataSource
从 CSV 文件加载数据。
ds.setUseFirstRowAsHeader(true)
使用 setUseFirstRowAsHeader
,我们告诉 JasperReports CSV 文件的第一行是标题。
在本文中,我们创建了一个带有分组数据的 PDF 文件报表。