代码之家  ›  专栏  ›  技术社区  ›  Robin Dijkhof

JasperReports在嵌套列表中报告奇数列表项

  •  0
  • Robin Dijkhof  · 技术社区  · 5 年前

    我得到了以下信息

    {
      "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

    我用2个嵌套列表创建了它,并将名称传递给嵌套列表。

    这很管用,但现在我想给奇怪的列表项上色。那就是黄苹果和绿梨。我在一个简单的列表中找到了一些例子,但是我有一个嵌套的列表,所以不起作用。

    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="Blank_A4" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20">
        <subDataset name="DatasetFruits">
            <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>
        </subDataset>
        <subDataset name="DatasetFruitsSort">
            <parameter name="FRUIT_NAME" class="java.lang.String"/>
            <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>
        </subDataset>
        <detail>
            <band height="125" splitType="Stretch">
                <componentElement>
                    <reportElement x="-20" y="43" width="595" height="30"/>
                    <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">
                        <datasetRun subDataset="DatasetFruits">
                            <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">
                                    <printWhenExpression><![CDATA[!$F{sorts}.equals("[]")]]></printWhenExpression>
                                </reportElement>
                                <jr:list>
                                    <datasetRun subDataset="DatasetFruitsSort">
                                        <datasetParameter name="FRUIT_NAME">
                                            <datasetParameterExpression><![CDATA[$F{name}]]></datasetParameterExpression>
                                        </datasetParameter>
                                        <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("sorts")]]></dataSourceExpression>
                                    </datasetRun>
                                    <jr:listContents height="30" width="595">
                                        <textField>
                                            <reportElement x="0" y="0" width="100" height="30"/>
                                            <textFieldExpression><![CDATA[$P{FRUIT_NAME}]]></textFieldExpression>
                                        </textField>
                                        <textField>
                                            <reportElement x="180" y="0" width="100" height="30"/>
                                            <textFieldExpression><![CDATA[$F{number}]]></textFieldExpression>
                                        </textField>
                                        <textField isBlankWhenNull="true">
                                            <reportElement x="400" y="0" width="190" height="30"/>
                                            <textFieldExpression><![CDATA[$F{comment}]]></textFieldExpression>
                                        </textField>
                                    </jr:listContents>
                                </jr:list>
                            </componentElement>
                        </jr:listContents>
                    </jr:list>
                </componentElement>
            </band>
        </detail>
    </jasperReport>
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   dada67    5 年前

    如果您使用的是JasperReports 6.3.1或更新版本,最简单的解决方案是切换到JSONQL,并使用单个列表而不是嵌套列表。您可以阅读关于JSONQL数据源的信息 here .

    使用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 这将保留以前嵌套的子数据集运行的行数。变量通过参数传递给nesteed子数据集;子数据集将其添加到当前行号,并在条件样式中使用结果。然后,最后的行计数返回到 副计数 变量

    <?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>
    
    推荐文章