【问题标题】:How to hide the page x of y when my jasper report has only one page当我的碧玉报告只有一页时,如何隐藏第 x 页
【发布时间】:2021-02-02 12:39:43
【问题描述】:

我正在使用 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>

【问题讨论】:

    标签: jasper-reports


    【解决方案1】:

    定义一个变量 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>
    

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

    【讨论】:

    • 嗨,谢谢您的回复。此解决方案运行良好。但如果我的报告前两页共有 10 页,则它不会显示第 1 页,共 10 页,第 2 页,共 10 页它显示 10,10。从第三页开始,它显示为 PAGE 3 OF 10。可能是什么问题。
    • 我对答案进行了更改,以便最后一个元素使用新的 NPAGES 变量,而不是在“报告”时间评估的 PAGE_NUMBER。这应该可以解决您的问题。请注意,如果您认为这是正确的答案,您应该检查答案旁边的小复选标记,让其他人知道。此外,您可以通过单击答案旁边的小 ^ 来为答案投票。这是标准的 stackoverflow 协议,如果您的回答接受率很高,人们会更认真地对待您的问题。谢谢!
    • 对不起,它对我不起作用。逻辑有问题。现在它在前两页和从第三页开始不显示任何内容 PAGE 3 OF 2,PAGE 4 OF 3,PAGE 5 OF 4这样。我的报告的总页数是10。
    • 这实际上似乎不可能,请您将新代码复制并粘贴到原始问题的底部。
    【解决方案2】:

    不,没有直接的方法可以实现这一点。在引擎正在填充第 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 就很简单了。

    【讨论】:

      【解决方案3】:

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

      步骤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 否则 empty

      例如:第 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}):" "]]>

      【讨论】:

        【解决方案4】:

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

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

        evaluation time 更改为master

        这是我的文本字段的完整 sn-p。

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多