【问题标题】:How to check if the row is first on each page?如何检查该行是否在每一页上都是第一行?
【发布时间】:2016-12-19 06:32:36
【问题描述】:

我有要打印的数据列表。我想知道是否有任何方法可以查找该行是否是 JasperReports 报告中每一页的第一行?

【问题讨论】:

标签: jasper-reports


【解决方案1】:

有一个内置变量名$V{PAGE_COUNT}

PAGE_COUNT - 内置变量,包含生成当前页面时处理的记录数。

该变量在页面上的第一条记录从1开始并计数到页面末尾,当创建新页面时它将重置为1。

这意味着页面上的第一条记录将具有此变量==1,例如,如果您想在第一行添加内容,可以使用printWhenExpression

<printWhenExpression><![CDATA[$V{PAGE_COUNT}.intValue()==1]]></printWhenExpression>

【讨论】:

    【解决方案2】:

    除了使用 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 文件)将是:

    【讨论】:

    • 当页面最后一个文本字段在下一页上延伸时,这两个示例都不起作用。所以这段 textField(看起来像下一页的第一次迭代 textField)有上一页的计数器,并且 isFirst=false。但是下一个字段(看起来像第二次迭代 textField)的 counter=1 和 isFirst=true。
    • 如果字段移动到下一个字段拆分类型=阻止,这也不起作用。再次没有正确重置 Page_count
    • @AlexK 您应该编辑您的答案,因为它在某些情况下不起作用。这是一个非常彻底的答案,因此也应包括例外情况。
    • 究竟是什么不起作用?这个概念?展示你的尝试
    猜你喜欢
    • 2013-10-29
    • 2013-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 2013-05-29
    • 2011-07-07
    • 1970-01-01
    相关资源
    最近更新 更多