ZetCode

JasperReports 条件样式

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

在本文中,我们将在 JasperReports 库中使用条件样式。条件样式可以通过 conditionalStyleconditionExpression 标签设置。

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

JasperReports 条件样式示例

以下应用程序在报表的每隔一行中使用粗体文本。

report.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="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>

conditionalStyleconditionExpression 标签用于定义条件样式。$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>

样式通过 reportElementstyle 属性指定;该元素必须是不透明的。

<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 中。

report.gvy
@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 模板文件被编译成一个 JasperReportJasperReport 是一个已编译的模板,可以填充数据。

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 文件。

在本文中,我们已将条件样式应用于报表。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在教学编程方面拥有十多年的经验。

列出 所有 JasperReports 教程