【问题标题】:How to enable different page headers on last and middle pages in jasper reports?如何在碧玉报告的最后一页和中间页上启用不同的页眉?
【发布时间】:2015-12-09 15:55:05
【问题描述】:

我需要启用具有 3 种页眉类型的报告:“首页页眉”、“中间页页眉”和“最后一页页眉”。所有这些标题都可以有不同数量的报表元素和不同的位置。页脚也是如此。

注意:报告必须在其Detail 带中支持报告元素,如 jr:tablejr:list。这些元素必须通过 xml 数据源与数据一起提供。

我能够使用Title 带模拟首页页眉,但我在启用“中间页页眉”和“最后一页页眉”时遇到问题。这就是我想要做的:

<pageHeader>
<band height="100" splitType="Stretch">
    <frame>
        <reportElement x="0" y="0" height="100" width="555" uuid="f788c74b-6853-4bc7-8ed7-5e3d538287c9" isRemoveLineWhenBlank="true">
            <printWhenExpression>
                <![CDATA[new Boolean($V{PAGE_NUMBER} == $V{PAGE_COUNT})]]>
            </printWhenExpression>
        </reportElement>
        <staticText>
            <reportElement x="1" y="1" width="100" height="20" uuid="9777208b-5323-4045-aa49-a849d5c00c89"/>
            <text><![CDATA[LAST PAGE HEADER TEXT 1]]></text>
        </staticText>
        <staticText>
            <reportElement x="50" y="10" width="200" height="50" uuid="15313676-09e6-4d17-ac75-2df99f61bfee"/>
            <text><![CDATA[LAST PAGE HEADER TEXT 2]]></text>
        </staticText>
    </frame>
    <frame>
        <reportElement x="0" y="0" height="100" width="555" uuid="65577abd-8717-477a-f27e-c70e9eba46af" isRemoveLineWhenBlank="true">
            <printWhenExpression>
                <![CDATA[new Boolean($V{PAGE_NUMBER} != 1) && new Boolean($V{PAGE_NUMBER} != $V{PAGE_COUNT})]]>
            </printWhenExpression>
        </reportElement>
        <staticText>
            <reportElement x="70" y="0" width="300" height="100" uuid="0a866eb3-85cf-4376-d6a4-21b534d36df0"/>
            <text><![CDATA[MIDDLE PAGE HEADER TEXT 1]]></text>
        </staticText>
    </frame>
</band>
</pageHeader>

我正在使用frame 块和printWhenExpression。根据printWhenExpression 条件,应该只打印两个frame 块中的一个(及其所有内容)。第一帧块应呈现“最后一页页眉”,第二个应呈现“中间页页眉”。

问题出在第一个frame(“最后一页页眉”)printWhenExpression

<printWhenExpression>
    <![CDATA[new Boolean($V{PAGE_NUMBER} == $V{PAGE_COUNT})]]>
</printWhenExpression>

在这种情况下,$V{PAGE_NUMBER} 始终等于 $V{PAGE_COUNT},因为需要评估时间。

有没有办法检查当前页面是否是最后一页?另外,有没有其他方法可以启用“中间页”和“最后一页”页眉?

注意:我能够使用framesLast Page Footer 带为页脚实现类似的逻辑!

【问题讨论】:

  • 嗨@PetterFriberg。我正在尝试实施您的解决方案,但 currentPage 变量在除第一个页面之外的所有页面上返回 null
  • 我正在使用“Jaspersoft iReport Designer 5.6.0”和“JDK 1.7.0_79”。
  • 如果您复制 jrxml 中的变量表达式和 pageHeader 中的 textField (设置位置,如果它带外),您应该在不同的页面组上看到不同的文本......我试过了它在 iReport Designer 5.6.0 中并使用 jasper 报告 6 导出为 pdf。
  • 我已经完成了你建议的一切,但仍然没有运气。这是我与the xml datasource 一起使用的the jasper template

标签: jasper-reports


【解决方案1】:

首先:$V{PAGE_COUNT}

生成当前页面时处理的记录数。因此,您在页面中拥有的记录数,而不是页码计数......

pageFooterlastPageFooter 中,reportElement 可以有负 Y 坐标(如果 IDE 不允许这样做,那么您需要手动编辑 jrxml)es。 y="-700",允许你在pageHeader和last pageHeader中放信息...

第一页

在框架中使用:

<printWhenExpression><![CDATA[new Boolean($V{PAGE_NUMBER}.intValue()==1)]]></printWhenExpression>
  • pageHeader 使用title 带或将框架放入pageFooter 并使用负y 坐标。
  • pageFooter,使用pageFooter


中页

关于框架使用:

<printWhenExpression><![CDATA[new Boolean($V{PAGE_NUMBER}.intValue()>1)]]></printWhenExpression>
  • pageHeader 将框架放入pageFooter 并使用负y 坐标。
  • pageFooter,使用pageFooter 带。


最后一页

  • pageHeader,将框架放入lastPageFooter,并使用负y坐标。
  • pageFooter,使用lastPageFooter


注意:要为这个虚拟页眉生成空间,请包含一个空的 pageHeader 和所需的带高度

玩得开心!

【讨论】:

  • 由于我需要在报告中支持列表或表格,因此在最后一页页脚上使用负 Y 坐标的解决方法似乎是唯一的解决方案。谢谢@Petter,一如既往地非常准确的回答。
  • 您不应该删除使用自定义 currentPage 变量的解决方法,它可能对某人有用。
  • @mrm 我认为从 jasper 报告的角度来看这更干净......(即使它在 IDE 中不好).. currentPage 是 1/2 hack,因此它不能与组件......(如果有人喜欢找到它,他们可以检查修订历史......;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多