Как вставить пустую строку в таблицу на основе условия в случае использования JRBeanCollectionDataSource? - PullRequest
0 голосов
/ 26 мая 2019

Существует список, и я использую этот механизм для передачи его в свой отчет о яшме:

JRBeanCollectionDataSource jrBeanCollectionDataSource = new JRBeanCollectionDataSource(list);

Объект этого списка выглядит следующим образом:

public class Test{
  private int id;
  //other properties  + getters & setter
}

Теперь предположим, что яв моем списке 10 элементов (id = от 1 до 10), и я хочу разделить их в одной таблице, используя пустую строку, то есть 5 строк сверху, одна пустая строка, 5 строк вниз.

Как это сделать

1 Ответ

1 голос
/ 26 мая 2019

Элемент вложенного отчета может помочь в решении этой проблемы - мы можем показать или скрыть вложенный отчет на основе условия, используя 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 будут:

The output at JSS

Альтернативные решения

  • Вы можете вставить элемент во время сборки коллекции перед передачей этой коллекции в JRBeanCollectionDataSource .

  • Вы можете реализовать пользовательский источник данных на основе JRBeanCollectionDataSource с некоторой логикой.

...