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 文件。
在本文中,我们已将条件样式应用于报表。