Jasper reports 除了最后一个迭代外,如何在细节中打印每个迭代的文本?

Jasper reports 除了最后一个迭代外,如何在细节中打印每个迭代的文本?,jasper-reports,Jasper Reports,我有一个子报告,它迭代名称。我想在每个循环上打印一个文本“或”,除了最后一个循环。现在我正在做一个建议的解决方案,但它仍然会在最后一次迭代中打印出来 以下是我现在拥有的一个样本: <?xml version="1.0" encoding="UTF-8"?> <!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 6.5.1 --> <ja

我有一个子报告,它迭代名称。我想在每个循环上打印一个文本“或”,除了最后一个循环。现在我正在做一个建议的解决方案,但它仍然会在最后一次迭代中打印出来

以下是我现在拥有的一个样本:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 6.5.1  -->
<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="paiwi-signatories-name-only-subreport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="8f474d5a-0cca-4c5f-807e-71af8848276f">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="signatoryJSON"/>
    <queryString language="json">
        <![CDATA[signatoryNames]]>
    </queryString>
    <field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[name]]></fieldDescription>
    </field>
    <field name="address" class="java.lang.String"/>
    <variable name="signatoryCurrentCount" class="java.lang.Integer" resetType="None">
        <variableExpression><![CDATA[$V{nameGroup_COUNT}]]></variableExpression>
    </variable>
    <group name="nameGroup">
        <groupExpression><![CDATA[$F{name}]]></groupExpression>
    </group>
    <detail>
        <band height="36" splitType="Stretch">
            <textField isBlankWhenNull="true">
                <reportElement positionType="Float" x="-20" y="-20" width="260" height="20" uuid="220a59b9-595b-4149-badd-f4a1ecff36c5"/>
                <textElement>
                    <font fontName="Times New Roman" size="12"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>
            <textField evaluationTime="Auto" isBlankWhenNull="true">
                <reportElement positionType="Float" x="0" y="0" width="100" height="20" isRemoveLineWhenBlank="true" uuid="afda4fcc-78fc-46f9-8c5c-2e0c4f04dfa5"/>
                <textFieldExpression><![CDATA[$V{signatoryCurrentCount}.equals($V{nameGroup_COUNT}) ? "or" : ""]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

子报表末尾仍有一个额外的

我现在拥有的当前子报表源代码:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.5.1.final using JasperReports Library version 6.5.1  -->
<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="paiwi-signatories-name-only-subreport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="8f474d5a-0cca-4c5f-807e-71af8848276f">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="signatoryJSON"/>
    <queryString language="json">
        <![CDATA[signatoryNames]]>
    </queryString>
    <field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[name]]></fieldDescription>
    </field>
    <field name="address" class="java.lang.String"/>
    <variable name="signatoryCurrentCount" class="java.lang.Integer" resetType="None">
        <variableExpression><![CDATA[$V{nameGroup_COUNT}]]></variableExpression>
    </variable>
    <group name="nameGroup">
        <groupExpression><![CDATA[$F{name}]]></groupExpression>
    </group>
    <detail>
        <band height="36" splitType="Stretch">
            <textField isBlankWhenNull="true">
                <reportElement positionType="Float" x="-20" y="-20" width="260" height="20" uuid="220a59b9-595b-4149-badd-f4a1ecff36c5"/>
                <textElement>
                    <font fontName="Times New Roman" size="12"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>
            <textField evaluationTime="Auto" isBlankWhenNull="true">
                <reportElement positionType="Float" x="0" y="0" width="100" height="20" isRemoveLineWhenBlank="true" uuid="afda4fcc-78fc-46f9-8c5c-2e0c4f04dfa5"/>
                <textFieldExpression><![CDATA[$V{signatoryCurrentCount}.equals($V{nameGroup_COUNT}) ? "or" : ""]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>


如何避免在最后一条记录之后打印最后一个文本字段?

您可以尝试一件简单的事情,将这两个变量放入您的报告中,我想您已经知道您的报告将包含多少页,然后将
printweenpression
语句更改为页面的值,例如,您的报告包含20页,然后在变量中将打印条件更改为
页码==20
页码<20

祝你好运。

如果你想利用
evalutationTime=“Auto”

变量将在其重置类型对应的时间进行评估

您需要两个具有不同重置时间的变量。根据您的示例,解决方案可以是:

将您的
signatoryCurrentCount
设置为
REPORT\u COUNT
,但每次组更改时都会重置(因此示例中的每条记录都会重置)

要理解重置类型为“Auto”的表达式,
signatoryCurrentCount
将有1,2,3(在组中重置)和
$V{REPORT\u COUNT}
始终是3(在报告中重置)

完整示例 jrxml

<?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="paiwi-signatories-name-only-subreport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="8f474d5a-0cca-4c5f-807e-71af8848276f">
    <queryString language="json">
        <![CDATA[signatoryNames]]>
    </queryString>
    <field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[name]]></fieldDescription>
    </field>
    <field name="address" class="java.lang.String"/>
    <variable name="signatoryCurrentCount" class="java.lang.Integer" resetType="Group" resetGroup="nameGroup">
        <variableExpression><![CDATA[$V{REPORT_COUNT}]]></variableExpression>
    </variable>
    <group name="nameGroup">
        <groupExpression><![CDATA[$F{name}]]></groupExpression>
    </group>
    <detail>
        <band height="36" splitType="Stretch">
            <textField isBlankWhenNull="true">
                <reportElement positionType="Float" x="-20" y="-20" width="260" height="20" uuid="220a59b9-595b-4149-badd-f4a1ecff36c5"/>
                <textElement>
                    <font fontName="Times New Roman" size="12"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>
            <textField evaluationTime="Auto" isBlankWhenNull="true">
                <reportElement positionType="Float" x="0" y="0" width="100" height="20" isRemoveLineWhenBlank="true" uuid="afda4fcc-78fc-46f9-8c5c-2e0c4f04dfa5"/>
                <textFieldExpression><![CDATA[$V{signatoryCurrentCount}<$V{REPORT_COUNT} ? "or" : ""]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

输出

注意:使用evaluationTime=“Auto”对于jasper report来说是资源密集型的,在大多数情况下,我建议用户在数据源中传递记录总数,报告生成速度会更快


嗨@PetterFriberg,谢谢你一如既往的帮助。我也有同样的想法,就像我有两个选择一样,要么在JasperReport中使用一个可用的选项(这是evaluationTime,谢谢你给我这些信息),要么只传递数据源中的记录总数。我可以通过在Java程序中获取数组的长度来使用它。我会在一天之内告诉你这方面的最新情况
<?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="paiwi-signatories-name-only-subreport" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="8f474d5a-0cca-4c5f-807e-71af8848276f">
    <queryString language="json">
        <![CDATA[signatoryNames]]>
    </queryString>
    <field name="name" class="java.lang.String">
        <fieldDescription><![CDATA[name]]></fieldDescription>
    </field>
    <field name="address" class="java.lang.String"/>
    <variable name="signatoryCurrentCount" class="java.lang.Integer" resetType="Group" resetGroup="nameGroup">
        <variableExpression><![CDATA[$V{REPORT_COUNT}]]></variableExpression>
    </variable>
    <group name="nameGroup">
        <groupExpression><![CDATA[$F{name}]]></groupExpression>
    </group>
    <detail>
        <band height="36" splitType="Stretch">
            <textField isBlankWhenNull="true">
                <reportElement positionType="Float" x="-20" y="-20" width="260" height="20" uuid="220a59b9-595b-4149-badd-f4a1ecff36c5"/>
                <textElement>
                    <font fontName="Times New Roman" size="12"/>
                </textElement>
                <textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
            </textField>
            <textField evaluationTime="Auto" isBlankWhenNull="true">
                <reportElement positionType="Float" x="0" y="0" width="100" height="20" isRemoveLineWhenBlank="true" uuid="afda4fcc-78fc-46f9-8c5c-2e0c4f04dfa5"/>
                <textFieldExpression><![CDATA[$V{signatoryCurrentCount}<$V{REPORT_COUNT} ? "or" : ""]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>