我有一个带有子报表的 JasperReport,但我需要第一个子报表出现的次数与我传递给 mian 报表的参数一样多。
例如,我有一份只有一个子报表的报表,而主报表收到一个值为 3 的参数,那么我需要在 jrxml 中,子报表及其详细信息带再重复两次,总共必须出现 3 次,并且每次子报表必须填充不同的数据源。
有没有办法在 Jrxml 中做到这一点?
谢谢。
我创建了一个简单的例子:
这个想法是从参数创建数据源,并将子报表放入带有此数据源的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} 您可以从列表或映射中为子报表的每个副本获取不同的数据源