Элемент вложенного отчета может помочь в решении этой проблемы - мы можем показать или скрыть вложенный отчет на основе условия, используя printWhenExpression .
В вашем случае нам нужно показатьвложенный отчет с одной пустой строкой.
Пример
вложенный отчет для отображения пустой строки очень прост.Ему не нужен источник данных для отображения данных - мы можем поместить staticText прямо на Title band.Нам также не нужны поля.
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="Empty Line" pageWidth="572" pageHeight="30" whenNoDataType="AllSectionsNoDetail" columnWidth="572" leftMargin="0" rightMargin="0" topMargin="0" bottomMargin="0">
<style name="bordered">
<box>
<pen lineWidth="0.25"/>
</box>
</style>
<title>
<band height="30" splitType="Stretch">
<staticText>
<reportElement style="bordered" x="0" y="0" width="572" height="30"/>
</staticText>
</band>
</title>
</jasperReport>
Я использовал простой csv источник данных, например - file films.csv содержит данные для отчета:
id,name,year,rating
1,The Shawshank Redemption,1994,9.3
2,The Godfather,1972,9.2
3,The Dark Knight,2008,9.0
4,The Godfather: Part II,1974,9.0
5,The Lord of the Rings: The Return of the King,2003,8.9
6,Pulp Fiction,1994,8.9
7,Schindler's List,1993,8.9
8,"The Good, the Bad and the Ugly",1966,8.9
9,12 Angry Men,1957,8.9
10,Avengers: Endgame,2019,8.8
Основной (главный) отчет использует CSV-файл Адаптер данных для построения отчета.
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="Insert blank row on condition" pageWidth="612" pageHeight="792" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" >
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="films.csv"/>
<style name="bordered">
<box>
<pen lineWidth="0.25"/>
</box>
</style>
<field name="id" class="java.lang.Integer"/>
<field name="name" class="java.lang.String"/>
<field name="year" class="java.lang.String"/>
<field name="rating" class="java.math.BigDecimal"/>
<title>
<band height="30" splitType="Stretch">
<staticText>
<reportElement x="158" y="0" width="256" height="30"/>
<text><![CDATA[Films. Showing empty line for Id == 5]]></text>
</staticText>
</band>
</title>
<columnHeader>
<band height="30">
<staticText>
<reportElement x="0" y="0" width="70" height="30"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Id]]></text>
</staticText>
<staticText>
<reportElement x="70" y="0" width="290" height="30"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Name]]></text>
</staticText>
<staticText>
<reportElement x="360" y="0" width="69" height="30"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Year]]></text>
</staticText>
<staticText>
<reportElement x="429" y="0" width="143" height="30"/>
<textElement textAlignment="Center" verticalAlignment="Middle"/>
<text><![CDATA[Rating]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="60">
<subreport>
<reportElement x="0" y="30" width="572" height="30" isRemoveLineWhenBlank="true" >
<printWhenExpression><![CDATA[$F{id} == 5]]></printWhenExpression>
</reportElement>
<subreportExpression><![CDATA["empty_row.jasper"]]></subreportExpression>
</subreport>
<textField>
<reportElement style="bordered" x="0" y="0" width="70" height="30"/>
<textElement textAlignment="Center"/>
<textFieldExpression><![CDATA[$F{id}]]></textFieldExpression>
</textField>
<textField>
<reportElement style="bordered" x="70" y="0" width="290" height="30"/>
<textElement textAlignment="Center"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement style="bordered" x="360" y="0" width="69" height="30"/>
<textElement textAlignment="Center"/>
<textFieldExpression><![CDATA[$F{year}]]></textFieldExpression>
</textField>
<textField>
<reportElement style="bordered" x="429" y="0" width="143" height="30"/>
<textElement textAlignment="Center"/>
<textFieldExpression><![CDATA[$F{rating}]]></textFieldExpression>
</textField>
</band>
</detail>
</jasperReport>
Я использовал <printWhenExpression><![CDATA[$F{id} == 5]]></printWhenExpression>
для скрытия подотчета с пустой строкой, это означает, что на пустой строке будет отображаться только строка с id == 5
.Вы можете использовать любое выражение.
Выходные данные в JSS будут:
Альтернативные решения
Вы можете вставить элемент во время сборки коллекции перед передачей этой коллекции в JRBeanCollectionDataSource .
Вы можете реализовать пользовательский источник данных на основе JRBeanCollectionDataSource с некоторой логикой.