JasperReports 条件样式
最后修改日期:2024 年 2 月 12 日
在本文中,我们将在 JasperReports 库中使用条件样式。条件样式可以通过 conditionalStyle 和 conditionExpression 标签设置。
JasperReports 是一个开源报告库。它可以创建各种格式的报告,包括 PDF、HTML、XLS 或 CSV。JasperReports 创建面向页面、可直接打印的文档。
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">
<style name="alt">
<conditionalStyle>
<conditionExpression>
<![CDATA[$V{COLUMN_COUNT} % 2 == 0]]>
</conditionExpression>
<style isBold="true"/>
</conditionalStyle>
</style>
<field name="name"/>
<field name="quantity" class="java.lang.Integer"/>
<detail>
<band height="20">
<textField>
<reportElement x="0" y="0" width="80" height="20" style="alt"/>
<textElement textAlignment="Right"/>
<textFieldExpression class="java.lang.String">
<![CDATA[$F{name}]]>
</textFieldExpression>
</textField>
<textField>
<reportElement x="100" y="0" width="80" height="20" style="alt"/>
<textElement textAlignment="Right"/>
<textFieldExpression class="java.lang.Integer">
<![CDATA[$F{quantity}]]>
</textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
这是报表模板文件。报表包含两列。
<style name="alt">
<conditionalStyle>
<conditionExpression>
<![CDATA[$V{COLUMN_COUNT} % 2 == 0]]>
</conditionExpression>
<style isBold="true"/>
</conditionalStyle>
</style>
conditionalStyle 和 conditionExpression 标签用于定义条件样式。$V{COLUMN_COUNT} % 2 == 0 表达式将样式应用于每隔一行。COLUMN_COUNT 是一个内置变量,引用 JasperReports 当前正在处理的行。(变量的名称具有误导性。)
<staticText>
<reportElement mode="Opaque" x="0" y="0" width="260"
height="16" style="alt"/>
<textElement />
<text><![CDATA[]]> </text>
</staticText>
样式通过 reportElement 的 style 属性指定;该元素必须是不透明的。
<field name="name"/> <field name="quantity" class="java.lang.Integer"/>;
字段映射到 map 键。
<textField>
<reportElement x="60" y="0" width="80" height="16" style="row"/>
<textElement />
<textFieldExpression class="java.lang.String">
<![CDATA[$F{Name}]]>
</textFieldExpression>
</textField>
Name 字段的值使用 $F{} 语法显示在 textField 中。
@Grab(group='net.sf.jasperreports', module='jasperreports', version='6.21.0')
@Grab(group='net.sf.jasperreports', module='jasperreports-fonts', 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.JRMapCollectionDataSource
def data = [
['name': 'pen', 'quantity': 5],
['name': 'table', 'quantity': 3],
['name': 'book', 'quantity': 20],
['name': 'cup', 'quantity': 7]
]
def xmlFile = "report.xml"
def jrReport = JasperCompileManager.compileReport(xmlFile)
def ds = new JRMapCollectionDataSource(data)
def params = [:]
def jrPrint = JasperFillManager.fillReport(jrReport, params, ds)
JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")
该示例生成一个报表,其中每隔一行都以粗体显示。
@Grab(group='net.sf.jasperreports', module='jasperreports-fonts', version='6.21.0')
我们需要 jasperreports-fonts 库来显示粗体文本。
def xmlFile = "report.xml" def jrReport = JasperCompileManager.compileReport(xmlFile)
XML 模板文件被编译成一个 JasperReport。JasperReport 是一个已编译的模板,可以填充数据。
def data = [
['name': 'pen', 'quantity': 5],
['name': 'table', 'quantity': 3],
['name': 'book', 'quantity': 20],
['name': 'cup', 'quantity': 7]
]
数据是一个简单的 map 列表。
def ds = new JRMapCollectionDataSource(data)
数据源是 JRMapCollectionDataSource。
def params = [:] def jrPrint = JasperFillManager.fillReport(jrReport, params, ds)
创建了一个 JasperPrint 对象;这是一个可以查看、打印或导出为其他格式的对象。我们将数据源传递给 JasperFillManager.fillReport 方法。没有参数。
JasperExportManager.exportReportToPdfFile(jrPrint, "report.pdf")
JasperExportManager.exportReportToPdfFile 方法将 JasperPrint 导出为 PDF 文件。
在本文中,我们已将条件样式应用于报表。