【发布时间】:2016-12-19 06:32:36
【问题描述】:
我有要打印的数据列表。我想知道是否有任何方法可以查找该行是否是 JasperReports 报告中每一页的第一行?
【问题讨论】:
-
请提供更多信息和/或告诉我们您已经尝试过什么。
标签: jasper-reports
我有要打印的数据列表。我想知道是否有任何方法可以查找该行是否是 JasperReports 报告中每一页的第一行?
【问题讨论】:
标签: jasper-reports
有一个内置变量名$V{PAGE_COUNT}
PAGE_COUNT - 内置变量,包含生成当前页面时处理的记录数。
该变量在页面上的第一条记录从1开始并计数到页面末尾,当创建新页面时它将重置为1。
这意味着页面上的第一条记录将具有此变量==1,例如,如果您想在第一行添加内容,可以使用printWhenExpression。
<printWhenExpression><![CDATA[$V{PAGE_COUNT}.intValue()==1]]></printWhenExpression>
【讨论】:
除了使用 JasperReports 引擎内置变量 PAGE_COUNT 之外,还可以通过多种方式解决此任务。
我们可以用resetType="Page"创建变量来计算页面的行数。
<variable name="counterOnPage" class="java.lang.Integer" resetType="Page" calculation="Sum">
<variableExpression><![CDATA[1]]></variableExpression>
<initialValueExpression><![CDATA[0]]></initialValueExpression>
</variable>
简单的 csv 数据源非常适合样本。
First page. Row 1
First page. Row 2
First page. Row 3
First page. Row 4
First page. Row 5
Second page. Row 1
Second page. Row 2
Second page. Row 3
Second page. Row 4
Second page. Row 5
Third page. Row 1
Third page. Row 2
Third page. Row 3
Third page. Row 4
Third page. Row 5
以下示例中此数据源的数据适配器名称为 rows.csv。字段的名称是 name
报告的高度足以每页仅显示 5 行。
<?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="Using variable" pageWidth="250" pageHeight="75" whenNoDataType="AllSectionsNoDetail" columnWidth="210" leftMargin="20" rightMargin="20" topMargin="0" bottomMargin="0">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="rows.csv"/>
<field name="name" class="java.lang.String"/>
<variable name="counterOnPage" class="java.lang.Integer" resetType="Page" calculation="Sum">
<variableExpression><![CDATA[1]]></variableExpression>
<initialValueExpression><![CDATA[0]]></initialValueExpression>
</variable>
<detail>
<band height="15">
<textField>
<reportElement x="0" y="0" width="180" height="15" uuid="1b535a7e-7a8e-4e44-91ff-c0b8415afcf1"/>
<textFieldExpression><![CDATA[($V{counterOnPage} == 1) ? $F{name} + "!" : $F{name}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
对于第一行,我们将添加符号“!”到字符串的末尾。
结果(pdf 文件)将是:
这是一个使用参数映射 ($P{REPORT_PARAMETERS_MAP}) 的小技巧。
我们可以设置一些“标志”(而不是使用变量)来标记页面的第一行。我们可以将 textField 放在 pageHeader 中,例如在报表的 Map 中设置值 isFirst。
<textField>
<reportElement x="0" y="0" width="100" height="1"/>
<textFieldExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.put("isFirst", true)]]></textFieldExpression>
</textField>
——我们正在初始化标志的值。
我们应该添加对 isFirst 值的检查,并在第一次使用后更改此标志的值。假的 textField 会做这个工作
<textField>
<reportElement x="180" y="0" width="0" height="15"/>
<textFieldExpression><![CDATA[((Boolean) $P{REPORT_PARAMETERS_MAP}.put("isFirst", false)) ? "" : ""]]></textFieldExpression>
</textField>
-- 我们正在重置标志的值。
数据源将是相同的。
<?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="Using Map" pageWidth="250" pageHeight="76" whenNoDataType="AllSectionsNoDetail" columnWidth="210" leftMargin="20" rightMargin="20" topMargin="0" bottomMargin="0">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="rows.csv"/>
<field name="name" class="java.lang.String"/>
<pageHeader>
<band height="1">
<textField>
<reportElement x="0" y="0" width="100" height="1"/>
<textFieldExpression><![CDATA[$P{REPORT_PARAMETERS_MAP}.put("isFirst", true)]]></textFieldExpression>
</textField>
</band>
</pageHeader>
<detail>
<band height="15">
<textField>
<reportElement x="0" y="0" width="180" height="15">
</reportElement>
<textFieldExpression><![CDATA[($P{REPORT_PARAMETERS_MAP}.get("isFirst") != null && ((Boolean) $P{REPORT_PARAMETERS_MAP}.get("isFirst")) == true) ? "! " + $F{name} + "!" : $F{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="180" y="0" width="0" height="15"/>
<textFieldExpression><![CDATA[((Boolean) $P{REPORT_PARAMETERS_MAP}.put("isFirst", false)) ? "" : ""]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
对于第一行,我们将添加符号“!”到字符串的开头和结尾。
结果(pdf 文件)将是:
【讨论】: