Как раскрасить нечетные элементы списка во вложенном списке? - PullRequest
0 голосов
/ 09 июля 2020

Я получил следующее json

{
  "data": [
    {
      "name": "apple",
      "sorts": [
        { "name": "green", "number": "6", "comment": "green apples are nice" },
        { "name": "yellow", "number": "1" },
        { "name": "red", "number": "2" }
      ]
    },
    {
      "name": "banana",
      "sorts": [
      ]
    },
    {
      "name": "pear",
      "sorts": [
        { "name": "green", "number": "6", "comment": "green pears are sour" },
        { "name": "purple", "number": "0", "comment": "so far we haven't seen purple pears" }
      ]
    }
  ]
}

Вот результат, который мне нужен: enter image description here

I created this with 2 nested list and passing the name to the nested list.

This works well, but now I want to color the odd list items. That would be the Yellow Apples and Green Pears. I found some example on how to do that on a simple list, but I have a nested list so that won't work.

JRXML:

<?xml version="1.0" encoding="UTF-8"?>
                                      

1 Ответ

1 голос
/ 10 июля 2020

Если вы используете JasperReports 6.3.1 или новее, самым простым решением является переключение на JSONQL и использование одного списка вместо вложенных списков. Вы можете прочитать об источниках данных JSONQL здесь .

С JSONQL вы можете иметь единый список, который выполняет итерацию по всем data.sorts.* узлам и получает имя фрукта через поле, которое поднимается по дереву . Затем с помощью одного списка вы можете использовать простой условный стиль для раскрашивания нечетных строк.

Все это будет выглядеть примерно так:

<?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="Blank_A4" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="af456afc-4615-4564-8841-81929ce2447f">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="Adapter"/>
    <style name="listRow">
        <conditionalStyle>
            <conditionExpression><![CDATA[$V{REPORT_COUNT} % 2 == 0]]></conditionExpression>
            <style mode="Opaque" backcolor="#FFFF00"/>
        </conditionalStyle>
    </style>
    <subDataset name="DatasetFruitsSortAll" uuid="5961129e-70f0-4d98-8d4e-524f2bbb28f9">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="Adapter"/>
        <queryString language="JSONQL">
            <![CDATA[data.sorts]]>
        </queryString>
        <field name="fruitName" class="java.lang.String">
            <property name="net.sf.jasperreports.jsonql.field.expression" value="^^.name"/>
            <fieldDescription><![CDATA[fruitName]]></fieldDescription>
        </field>
        <field name="name" class="java.lang.String">
            <property name="net.sf.jasperreports.json.field.expression" value="name"/>
            <fieldDescription><![CDATA[name]]></fieldDescription>
        </field>
        <field name="number" class="java.lang.Integer">
            <property name="net.sf.jasperreports.json.field.expression" value="number"/>
            <fieldDescription><![CDATA[number]]></fieldDescription>
        </field>
        <field name="comment" class="java.lang.String">
            <property name="net.sf.jasperreports.json.field.expression" value="comment"/>
            <fieldDescription><![CDATA[comment]]></fieldDescription>
        </field>
    </subDataset>
    <queryString language="JSONQL">
        <![CDATA[]]>
    </queryString>
    <detail>
        <band height="125" splitType="Stretch">
            <componentElement>
                <reportElement x="0" y="0" width="595" height="30" isRemoveLineWhenBlank="true" uuid="c4206620-ee0d-4e50-9336-1e1be2723c6f"/>
                <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="DatasetFruitsSortAll" uuid="b9df9d8f-7ada-47eb-84e6-4870547e7bd9">
                        <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonQLDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("data.sorts.*")]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="30" width="595">
                        <frame>
                            <reportElement style="listRow" x="0" y="0" width="590" height="30" uuid="3b3fba3d-e4c5-499c-a752-b6caa847a448"/>
                            <textField>
                                <reportElement x="0" y="0" width="100" height="30" uuid="bd3ac2b2-1803-4e0f-afa8-a0bdcc54e6fb"/>
                                <textFieldExpression><![CDATA[$F{fruitName}]]></textFieldExpression>
                            </textField>
                            <textField>
                                <reportElement x="180" y="0" width="100" height="30" uuid="be871dcb-61a0-49bd-b565-af8aa27bc7f4"/>
                                <textFieldExpression><![CDATA[$F{number}]]></textFieldExpression>
                            </textField>
                            <textField isBlankWhenNull="true">
                                <reportElement x="400" y="0" width="190" height="30" uuid="bea6dae7-bca2-4c0a-a0b5-443a859c20ac"/>
                                <textFieldExpression><![CDATA[$F{comment}]]></textFieldExpression>
                            </textField>
                        </frame>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </detail>
</jasperReport>

Если по какой-то причине JSONQL или отдельный список вам не подходят, вы можете раскрасить нечетные строки вложенными списками, указав текущий номер строки во вложенном списке. Для этого вам нужно будет передавать значение вперед и назад во вложенный поднабор и обратно через параметр и возвращаемое значение.

Вот как будет выглядеть весь отчет. Вложенный поднабор подданных имеет переменную с именем subRowCount, в которой хранится счетчик строк предыдущих запусков вложенного поднабора. Переменная передается в нестандартный поднабор данных через параметр; поднабор данных добавляет его к текущему номеру строки и использует результат в условном стиле. Затем окончательное количество строк возвращается обратно в переменную subRowCount.

<?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="Blank_A4" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="af456afc-4615-4564-8841-81929ce2447f">
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="Adapter"/>
    <style name="listRow">
        <conditionalStyle>
            <conditionExpression><![CDATA[$V{runningRowCount} % 2 == 0]]></conditionExpression>
            <style mode="Opaque" backcolor="#FFFF00"/>
        </conditionalStyle>
    </style>
    <subDataset name="DatasetFruits" uuid="5824cf79-a97e-4cf1-954b-cc0c327c8405">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="Adapter"/>
        <queryString language="JSON">
            <![CDATA[data]]>
        </queryString>
        <field name="name" class="java.lang.String">
            <property name="net.sf.jasperreports.json.field.expression" value="name"/>
            <fieldDescription><![CDATA[name]]></fieldDescription>
        </field>
        <field name="sorts" class="java.lang.String">
            <property name="net.sf.jasperreports.json.field.expression" value="sorts"/>
            <fieldDescription><![CDATA[sorts]]></fieldDescription>
        </field>
        <variable name="subRowCount" class="java.lang.Integer" calculation="System">
            <initialValueExpression><![CDATA[0]]></initialValueExpression>
        </variable>
    </subDataset>
    <subDataset name="DatasetFruitsSort" uuid="5961129e-70f0-4d98-8d4e-524f2bbb28f9">
        <property name="com.jaspersoft.studio.data.defaultdataadapter" value="Adapter"/>
        <parameter name="FRUIT_NAME" class="java.lang.String"/>
        <parameter name="prevRowCount" class="java.lang.Integer"/>
        <queryString language="JSON">
            <![CDATA[data.sorts]]>
        </queryString>
        <field name="name" class="java.lang.String">
            <property name="net.sf.jasperreports.json.field.expression" value="name"/>
            <fieldDescription><![CDATA[name]]></fieldDescription>
        </field>
        <field name="number" class="java.lang.Integer">
            <property name="net.sf.jasperreports.json.field.expression" value="number"/>
            <fieldDescription><![CDATA[number]]></fieldDescription>
        </field>
        <field name="comment" class="java.lang.String">
            <property name="net.sf.jasperreports.json.field.expression" value="comment"/>
            <fieldDescription><![CDATA[comment]]></fieldDescription>
        </field>
        <variable name="runningRowCount" class="java.lang.Integer">
            <variableExpression><![CDATA[$P{prevRowCount} + $V{REPORT_COUNT}]]></variableExpression>
        </variable>
    </subDataset>
    <queryString language="json">
        <![CDATA[]]>
    </queryString>
    <detail>
        <band height="125" splitType="Stretch">
            <componentElement>
                <reportElement x="-20" y="43" width="595" height="30" uuid="da841d21-e910-4ce3-b415-1c68cade0981"/>
                <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="DatasetFruits" uuid="4baf7682-130d-4b12-a973-8ab6084373de">
                        <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("data")]]></dataSourceExpression>
                    </datasetRun>
                    <jr:listContents height="30" width="595">
                        <componentElement>
                            <reportElement x="0" y="0" width="595" height="30" isRemoveLineWhenBlank="true" uuid="c4206620-ee0d-4e50-9336-1e1be2723c6f">
                                <printWhenExpression><![CDATA[!$F{sorts}.equals("[]")]]></printWhenExpression>
                            </reportElement>
                            <jr:list printOrder="Vertical">
                                <datasetRun subDataset="DatasetFruitsSort" uuid="b9df9d8f-7ada-47eb-84e6-4870547e7bd9">
                                    <datasetParameter name="FRUIT_NAME">
                                        <datasetParameterExpression><![CDATA[$F{name}]]></datasetParameterExpression>
                                    </datasetParameter>
                                    <datasetParameter name="prevRowCount">
                                        <datasetParameterExpression><![CDATA[$V{subRowCount}]]></datasetParameterExpression>
                                    </datasetParameter>
                                    <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("sorts")]]></dataSourceExpression>
                                    <returnValue fromVariable="runningRowCount" toVariable="subRowCount"/>
                                </datasetRun>
                                <jr:listContents height="30" width="595">
                                    <frame>
                                        <reportElement style="listRow" x="0" y="0" width="590" height="30" uuid="3b3fba3d-e4c5-499c-a752-b6caa847a448"/>
                                        <textField>
                                            <reportElement x="0" y="0" width="100" height="30" uuid="bd3ac2b2-1803-4e0f-afa8-a0bdcc54e6fb"/>
                                            <textFieldExpression><![CDATA[$P{FRUIT_NAME}]]></textFieldExpression>
                                        </textField>
                                        <textField>
                                            <reportElement x="180" y="0" width="100" height="30" uuid="be871dcb-61a0-49bd-b565-af8aa27bc7f4"/>
                                            <textFieldExpression><![CDATA[$F{number}]]></textFieldExpression>
                                        </textField>
                                        <textField isBlankWhenNull="true">
                                            <reportElement x="400" y="0" width="190" height="30" uuid="bea6dae7-bca2-4c0a-a0b5-443a859c20ac"/>
                                            <textFieldExpression><![CDATA[$F{comment}]]></textFieldExpression>
                                        </textField>
                                    </frame>
                                </jr:listContents>
                            </jr:list>
                        </componentElement>
                    </jr:listContents>
                </jr:list>
            </componentElement>
        </band>
    </detail>
</jasperReport>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...