Jasper reports 如何在以编程方式追加';续';后续章节的信息?

Jasper reports 如何在以编程方式追加';续';后续章节的信息?,jasper-reports,subreport,Jasper Reports,Subreport,如果动态大小不适合当前列,我有一个客户请求将个人信息的详细信息(姓名、地址、次要地址等)拆分到多个列中。需要注意的是,名称字段后跟单词“(Continued)”,作为后续列中段的标题 jasper reports是否可能出现这种行为 我尝试过用beforeDetailEval()和afterDetailEval()钩子切换“中间”标志,在列标题栏中检查该标志,以可选地重新打印名称+“Continued”,但列标题总是在afterDetailEval()方法之后调用scriptlet方法(在我的小

如果动态大小不适合当前列,我有一个客户请求将个人信息的详细信息(姓名、地址、次要地址等)拆分到多个列中。需要注意的是,名称字段后跟单词“(Continued)”,作为后续列中段的标题

jasper reports是否可能出现这种行为

我尝试过用beforeDetailEval()和afterDetailEval()钩子切换“中间”标志,在列标题栏中检查该标志,以可选地重新打印名称+“Continued”,但列标题总是在afterDetailEval()方法之后调用scriptlet方法(在我的小头脑中没有意义),由于“中间”标志重置为false,因此失败

(注意:明细栏已将splitType设置为“立即”和“拉伸”,但这两种方法的行为均未达到预期。整个栏仅在下一列开始时重新启动)

这可能吗?如果可能,是否有针对这种情况的创造性解决方案的建议

此外,还有一种奇怪的行为显示,如果一个细节被拆分到多个列中,那么细节的第一部分(直到子报表元素)将复制到下一列中。这种行为对客户来说也是不可取的,需要进行调整,以便不复制任何内容(标题除外)

这是客户需要的语法:

Name 1                              Name 2
Address 1                           (Continued)
City 1                              AL – Address 3
State 1                             AL - City 3
Zip 1                               AL - State 3
Additional Locations:               AL - Zip 3
AL-Address 1                        ...
AL-City 1
AL-State 1
AL-Zip 1
AL-Address 2
AL-City 2
AL-State 2
AL-Zip 2

Name 2
Address 2
City 2
State 2
Zip 2
Additional Locations:
AL-Address 1
AL – City 1
AL-State 1
AL – Zip 1
AL – Address 2
AL – City 2
AL – State 2
AL – Zip 2
这就是我们实际得到的:

Name1                    Name1
Address1                 Address1
City1                    City1
State1                   State1
Zip1                     Zip1
Additional Locations     Additional Locations
AL-Name1                 AL-City2
AL-Address1              AL-State2
AL-City1                 AL-State2
AL-State1
AL-Zip1
AL-Name2
AL-Address2
这是一个示例主jrxml文件:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.3.1.final using JasperReports Library version 6.3.1  -->
<!-- 2017-06-22T09:48:08 -->
<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="Blank_A4" columnCount="2" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" scriptletClass="path.to.my.scriptlet" uuid="af53d807-7975-4ff7-bfc5-e438944aa795">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <field name="Name" class="java.lang.String"/>
    <field name="Address" class="java.lang.String"/>
    <field name="City" class="java.lang.String"/>
    <field name="State" class="java.lang.String"/>
    <field name="Zip" class="java.lang.String"/>
    <field name="AdditionalLocations" class="java.util.List"/>
    <variable name="IN_MIDDLE_OF_DETAIL" class="java.lang.Boolean" calculation="System">
        <initialValueExpression><![CDATA[Boolean.False]]></initialValueExpression>
    </variable>
    <columnHeader>
        <band height="74" splitType="Stretch">
            <textField isBlankWhenNull="true">
                <reportElement x="-10" y="0" width="100" height="30" uuid="258dce49-fb61-4887-bb30-69e80e96d8f1">
                    <printWhenExpression><![CDATA[$V{IN_MIDDLE_OF_DETAIL}]]></printWhenExpression>
                </reportElement>
                <textFieldExpression><![CDATA[$F{Name}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="-10" y="40" width="100" height="30" uuid="c18b2fab-900b-4641-aaef-2520510a3510">
                    <printWhenExpression><![CDATA[$V{IN_MIDDLE_OF_DETAIL}]]></printWhenExpression>
                </reportElement>
                <textFieldExpression><![CDATA["(CONTINUED)"]]></textFieldExpression>
            </textField>
        </band>
    </columnHeader>
    <detail>
        <band height="426" splitType="Stretch">
            <textField>
                <reportElement x="0" y="10" width="100" height="30" uuid="853a1b0d-a49e-45c4-8183-83cfd69bf5af"/>
                <textFieldExpression><![CDATA[$F{Name}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="0" y="50" width="100" height="30" uuid="46697c6d-1c2f-422b-9170-6b2f36ce13ba"/>
                <textFieldExpression><![CDATA[$F{Address}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="0" y="90" width="100" height="30" uuid="31730cd5-0b17-452e-8a22-d16ea2061605"/>
                <textFieldExpression><![CDATA[$F{City}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="0" y="120" width="100" height="30" uuid="b4a4c671-dc63-41b4-b080-9ad5b750bb58"/>
                <textFieldExpression><![CDATA[$F{State}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="0" y="160" width="100" height="30" uuid="8f8bec7c-3d4a-466b-8b02-2bb82e61904d"/>
                <textFieldExpression><![CDATA[$F{Zip}]]></textFieldExpression>
            </textField>
            <subreport>
                <reportElement x="0" y="220" width="100" height="110" uuid="8ef583fd-fa23-47d8-80d0-90de4f6478a0"/>
                <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{AdditionalLocations})]]></dataSourceExpression>
                <subreportExpression><![CDATA["Blank_A4_1.jasper"]]></subreportExpression>
            </subreport>
            <staticText>
                <reportElement x="10" y="198" width="100" height="30" uuid="4887e0c1-3da2-4350-9454-4a3e33c0fe71"/>
                <text><![CDATA[Additional Locations]]></text>
            </staticText>
        </band>
    </detail>
</jasperReport>
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.3.1.final using JasperReports Library version 6.3.1  -->
<!-- 2017-06-22T10:39:43 -->
<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="Blank_A4_1" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="9b8a1d93-2ee6-4d29-b9ec-7c56a3917729">
    <queryString>
        <![CDATA[]]>
    </queryString>
    <field name="Address" class="java.lang.String"/>
    <field name="City" class="java.lang.String"/>
    <field name="State" class="java.lang.String"/>
    <field name="Zip" class="java.lang.String"/>
    <detail>
        <band height="168" splitType="Stretch">
            <textField isBlankWhenNull="true">
                <reportElement x="0" y="10" width="100" height="30" uuid="3d74e624-6b6f-40e9-87d2-ddb5022668b2"/>
                <textFieldExpression><![CDATA[$F{Address}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="0" y="50" width="100" height="30" uuid="5df31fa3-38ee-44a4-8931-e8eef45fb7a6"/>
                <textFieldExpression><![CDATA[$F{City}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="0" y="89" width="100" height="30" uuid="964a282f-54c7-44a3-954d-27d1c70d3d0c"/>
                <textFieldExpression><![CDATA[$F{State}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement x="0" y="130" width="100" height="30" uuid="e1349222-d945-4dec-8454-e2d6e3fb6a2a"/>
                <textFieldExpression><![CDATA[$F{Zip}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>
删除scriptlet,不需要这样做,让我们使用子报表有自己的页面计数这一事实,因此当它在主报表中中断时,它会计数一个页面

我将使用的解决方案是子报表中的
pageHeader
带,在页码(>1)上带有
printWheenexpression

这意味着,当子报表拆分为新的“页面”(名称和“继续”)时,您希望显示的文本将进入子报表的
pageHeader
,并应打印在除第一个之外的所有子报表“页面”上

由于名称似乎不是子报表数据源的一部分,我将把它作为参数传递给子报表

在子报表中编码,以便在页面>1时显示标题

<pageHeader>
    <band height="44">
    <printWhenExpression><![CDATA[$V{PAGE_NUMBER}>1]]></printWhenExpression>
    <textField>
        <reportElement x="0" y="0" width="220" height="20" uuid="8cce4cab-6ccf-4ddb-b1f1-508dc97bfcfe"/>
        <textElement verticalAlignment="Middle">
            <font isBold="true"/>
        </textElement>
        <textFieldExpression><![CDATA[$P{name}]]></textFieldExpression>
    </textField>
    <textField>
        <reportElement x="0" y="20" width="220" height="19" uuid="c18b2fab-900b-4641-aaef-2520510a3510"/>
        <textElement verticalAlignment="Middle">
            <font isItalic="true"/>
        </textElement>
        <textFieldExpression><![CDATA["(Continued)"]]></textFieldExpression>
    </textField>
</band>
</pageHeader>

1]]>
示例输出

我已经降低了页面高度,以减少图像

完整示例
**主报告jrxml**
**子报表jrxml**
1]]>
删除scriptlet,不需要这样做,让我们使用子报表有自己的页面计数这一事实,因此当它在主报表中中断时,它会计数一个页面

我将使用的解决方案是子报表中的
pageHeader
带,在页码(>1)上带有
printWheenexpression

这意味着,当子报表拆分为新的“页面”(名称和“继续”)时,您希望显示的文本将进入子报表的
pageHeader
,并应打印在除第一个之外的所有子报表“页面”上

由于名称似乎不是子报表数据源的一部分,我将把它作为参数传递给子报表

在子报表中编码,以便在页面>1时显示标题

<pageHeader>
    <band height="44">
    <printWhenExpression><![CDATA[$V{PAGE_NUMBER}>1]]></printWhenExpression>
    <textField>
        <reportElement x="0" y="0" width="220" height="20" uuid="8cce4cab-6ccf-4ddb-b1f1-508dc97bfcfe"/>
        <textElement verticalAlignment="Middle">
            <font isBold="true"/>
        </textElement>
        <textFieldExpression><![CDATA[$P{name}]]></textFieldExpression>
    </textField>
    <textField>
        <reportElement x="0" y="20" width="220" height="19" uuid="c18b2fab-900b-4641-aaef-2520510a3510"/>
        <textElement verticalAlignment="Middle">
            <font isItalic="true"/>
        </textElement>
        <textFieldExpression><![CDATA["(Continued)"]]></textFieldExpression>
    </textField>
</band>
</pageHeader>

1]]>
示例输出

我已经降低了页面高度,以减少图像

完整示例
**主报告jrxml**
**子报表jrxml**
1]]>

谢谢你的建议。这个问题非常广泛,当我仔细阅读时,我会尝试对其进行微调。名称、地址等都是与数据源分开的字段。但您是在列上还是在页上拆分?在您的示例中,我看不到多个列。我正在对列进行拆分(或至少尝试拆分)。在模拟jrxml文件中,我没有将columnCount设置为2。已经调整了。两个可以解决我的问题。这只是一个模拟页面。ACME专有规则不允许我把实际的代码放上去没有问题,模拟代码也更好,因为它减少了代码大小,我回答说,试图在jasper report中向您展示如何做到这一点,实际上首先我教的所有文本都在一个文本字段中,很抱歉混淆,但是的,我们需要感谢这个想法。这个问题非常广泛,当我仔细阅读时,我会尝试对其进行微调。名称、地址等都是与数据源分开的字段。但您是在列上还是在页上拆分?在您的示例中,我看不到多个列。我正在对列进行拆分(或至少尝试拆分)。在模拟jrxml文件中,我没有将columnCount设置为2。已经调整了。两个可以解决我的问题。这只是一个模拟页面。ACME专有规则不允许我把实际的代码放上去。没问题,模拟代码也是最好的