2

我正在使用 jasper-reports 4.5.0 并且正在生成报告。我的要求是,如果我的报告只有一页,那么它不应该显示页面 1 0f 1。我该怎么做。要显示页面 x of y我正在使用以下代码行。

  <textField>
                <reportElement x="395" y="121" width="20" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="350" y="121" width="45" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA["PAGE"]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="415" y="121" width="25" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA["OF"]]></textFieldExpression>
            </textField>
            <textField evaluationTime="Report">
                <reportElement x="440" y="121" width="19" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$V{PAGE_NUMBER}]]></textFieldExpression>
            </textField>

这是新修改的代码。

<variable name="NPAGES" class="java.lang.Integer" calculation="Highest">
        <variableExpression><![CDATA[$V{PAGE_NUMBER}]]></variableExpression>
        <initialValueExpression><![CDATA[$V{PAGE_NUMBER}]]></initialValueExpression>
    </variable>

<textField>
                <reportElement x="395" y="121" width="20" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? $V{PAGE_NUMBER} : ""]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="350" y="121" width="45" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? "PAGE" : ""]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="415" y="121" width="25" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? "OF" : ""]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="440" y="121" width="19" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? $V{NPAGES} : ""]]></textFieldExpression>
            </textField>
4

4 回答 4

3

定义一个变量 NPAGES,它设置为报告中的总页数:

<variable name="NPAGES" class="java.lang.Integer" calculation="Highest">
    <variableExpression><![CDATA[$V{PAGE_NUMBER}]]></variableExpression>
    <initialValueExpression><![CDATA[$V{PAGE_NUMBER}]]></initialValueExpression>
</variable>

现在,使用该变量作为条件来确定是否显示页码:

        <textField>
            <reportElement x="395" y="121" width="20" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? $V{PAGE_NUMBER} : ""]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement x="350" y="121" width="45" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? "PAGE" : ""]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement x="415" y="121" width="25" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? "OF" : ""]]></textFieldExpression>
        </textField>
        <textField>
            <reportElement x="440" y="121" width="19" height="20"/>
            <textElement/>
            <textFieldExpression><![CDATA[($V{NPAGES} > 1) ? $V{NPAGES} : ""]]></textFieldExpression>
        </textField>

我在我的一份报告中尝试了这一点,它奏效了。

于 2012-06-07T13:50:42.183 回答
1

不,没有直接的方法可以实现这一点。在引擎正在填充第 1 页的那一刻,它不知道是否会有第 2 页。延迟的评估时间不足以解决这个问题。

最简单的类似解决方案是在第 1 页上隐藏“第 x 页,共 y 页”。这不符合您声明的要求......但有些人非常喜欢它。

最好的相对简单的解决方案是使用子报表。创建一个只执行当前报表查询的主报表。创建一个名为$P{subreport_has_more_than_one_page}(或者,呃,使用更简洁的名称)的布尔参数。希望您可以使用简单的逻辑,例如知道如果报告返回超过 25 行,您的报告将是多个页面。这不一定是可能的……但在现实世界的很大一部分案例中,这确实是可能的。如果您的页面依赖于不可预测的换行长文本,这可能会很困难。

假设您可以确定 的值$P{subreport_has_more_than_one_page},则将此参数传递给子报表。子报表只是您现有的报表。有了这个值,在第一页的“Page x of y”中添加一个 Print When Expression 就很简单了。

于 2012-06-11T05:36:12.967 回答
0

我们可以按照以下步骤实现这一点。

第 1 步:创建变量,以便存储当前页码。

<variable name="V_CURRENT_PAGE_NUMBER" class="java.lang.Integer" resetType="Page">
    <variableExpression><![CDATA[1]]></variableExpression>
    <initialValueExpression><![CDATA[$V{PAGE_NUMBER}+1]]></initialValueExpression>
</variable>

step2:添加文本字段,evaluationTime 应该是Auto

价值将是

$V{PAGE_NUMBER}>1?msg("第 {0} 页,共 {1} 页",$V{V_CURRENT_PAGE_NUMBER},$V{PAGE_NUMBER}):" "

这样 PAGE_NUMBER 值如果大于 1 则打印页面current_page of total_report_page否则为

例如:第 1 页,共 3 页

<textField evaluationTime="Auto">
            <reportElement positionType="Float" x="475" y="37" width="74" height="15"/>
            <textElement/>
            <textFieldExpression><![CDATA[$V{PAGE_NUMBER}>1?

msg("第 {0} 页,共 {1} 页", $V{V_CURRENT_PAGE_NUMBER}, $V{PAGE_NUMBER}):" "]]>

于 2018-04-25T08:50:02.327 回答
0

使用变量 of$V{MASTER_TOTAL_PAGES}$V{MASTER_CURRENT_PAGE}代替页码。我尝试制作文本字段来显示页码。然后在文本字段中添加这个表达式

$V{MASTER_TOTAL_PAGES} > 1 ? "(PAGE/OF) "+$V{MASTER_CURRENT_PAGE}+"/"+$V{MASTER_TOTAL_PAGES} : ""

将 更改evaluation timemaster

这是我的文本字段的完整片段。

<textField textAdjust="StretchHeight" evaluationTime="Master">
    <reportElement x="315" y="108" width="179" height="20" uuid="0ea93412-058f-49a0-95ac-06728421e4f1"/>
    <textElement textAlignment="Right" verticalAlignment="Middle">
        <font fontName="ThaiFontFamily" size="10"/>
    </textElement>
    <textFieldExpression><![CDATA[$V{MASTER_TOTAL_PAGES} > 1 ? "(PAGE/OF) "+$V{MASTER_CURRENT_PAGE}+"/"+$V{MASTER_TOTAL_PAGES} : ""]]></textFieldExpression>
</textField>

注意:我认为这仅在您有一份主报告且不使用子报告时才有效。

于 2021-02-02T04:30:52.887 回答