JasperReports 动态子报表数量

问题描述 投票:0回答:1

我有一个带有子报表的 JasperReport,但我需要第一个子报表出现的次数与我传递给 mian 报表的参数一样多。

例如,我有一份只有一个子报表的报表,而主报表收到一个值为 3 的参数,那么我需要在 jrxml 中,子报表及其详细信息带再重复两次,总共必须出现 3 次,并且每次子报表必须填充不同的数据源。

有没有办法在 Jrxml 中做到这一点?

谢谢。

jasper-reports report jaspersoft-studio dynamic-jasper
1个回答
0
投票

我创建了一个简单的例子:

这个想法是从参数创建数据源,并将子报表放入带有此数据源的ListView中:

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.21.0.final using JasperReports Library version 6.21.0-4f56c4f36cd19e17675219a9ac4692d5f0f13b06  -->
<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="Führungskräftegespräch" pageWidth="602" pageHeight="3000" columnWidth="602" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0" isFloatColumnFooter="true" uuid="80afabe3-2d3d-4c26-8c41-8e3b10a62a77">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="One Empty Record"/>
    <subDataset name="RepeatIt" uuid="c5f91cd8-09b8-4636-a534-b0c7567b65c7">
        <queryString>
            <![CDATA[]]>
        </queryString>
        <field name="chart" class="java.util.Map"/>
    </subDataset>
    <parameter name="copies" class="java.lang.Integer" evaluationTime="Early">
        <defaultValueExpression><![CDATA[3]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[]]>
    </queryString>
    <variable name="copiesDS" class="net.sf.jasperreports.engine.data.JRMapCollectionDataSource">
        <variableExpression><![CDATA[new net.sf.jasperreports.engine.data.JRMapCollectionDataSource(   java.util.stream.LongStream.range(0,$P{copies}).mapToObj(i -> new java.util.HashMap<String,Object>()).collect(java.util.stream.Collectors.toList()))]]></variableExpression>
    </variable>
    <background>
        <band splitType="Stretch"/>
    </background>
    <summary>
        <band height="842">
            <property name="com.jaspersoft.studio.unit.height" value="px"/>
            <componentElement>
                <reportElement x="0" y="40" width="602" height="250" uuid="ceff3806-55f5-4520-994f-f3e23bfa8414">
                    <property name="com.jaspersoft.studio.unit.x" value="px"/>
                    <property name="com.jaspersoft.studio.unit.height" value="px"/>
                    <property name="com.jaspersoft.studio.unit.y" value="px"/>
                </reportElement>
                <jr:list xmlns:jr="http://jasperreports.sourceforge.net/jasperreports/components" xsi:schemaLocation="http://jasperreports.sourceforge.net/jasperreports/components http://jasperreports.sourceforge.net/xsd/components.xsd" printOrder="Vertical">
                    <datasetRun subDataset="RepeatIt" uuid="9e508cff-3852-411f-948f-42287277a321">
                        <dataSourceExpression><![CDATA[$V{copiesDS}]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="250" width="602">
                        <subreport>
                            <reportElement x="0" y="40" width="602" height="200" uuid="d0f09473-4a88-47fa-9600-fcbfa364e213">
                                <property name="com.jaspersoft.studio.unit.height" value="px"/>
                                <property name="com.jaspersoft.studio.unit.x" value="px"/>
                                <property name="com.jaspersoft.studio.unit.width" value="px"/>
                            </reportElement>
                            <dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource()]]></dataSourceExpression>
                            <subreportExpression><![CDATA["subreport.jrxml"]]></subreportExpression>
                        </subreport>
                        <textField>
                            <reportElement x="220" y="0" width="267" height="28" uuid="78dee0fc-70a5-421e-9d21-6cb9d9909090"/>
                            <textFieldExpression><![CDATA[$V{REPORT_COUNT}]]></textFieldExpression>
                        </textField>
                    </jr:listContents>
                </jr:list>
            </componentElement>
            <staticText>
                <reportElement x="210" y="10" width="100" height="30" uuid="0ac46265-4524-42a2-a14a-220ee44b165d"/>
                <text><![CDATA[Main Report]]></text>
            </staticText>
        </band>
    </summary>
</jasperReport>

使用 $V{REPORT_COUNT} 您可以从列表或映射中为子报表的每个副本获取不同的数据源

© www.soinside.com 2019 - 2024. All rights reserved.