json - 如何为嵌套列表中的奇数列表项着色?
问题描述
我得到了以下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" }
]
}
]
}
我用 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>
解决方案
如果您使用 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>
推荐阅读
- json - 如何让 jq 在层次结构深处设置值?
- python - 按另一个数组对 numpy 数组进行排序
- python - Python 请求库、发送帖子、获取、验证和下载文件
- wordpress - 从结帐中删除“购物车已更新”
- nunit - NUnit CLI/C++ TestCase:不能使用数组作为参数
- python - 矩形和鼠标之间的碰撞
- c# - 如何根据 GraphQL 中的查询参数解析特定的 DbContext?
- go - Go Fyne 中的绑定表数据
- docker - 从 Ubuntu 容器中启动 weston
- pytorch - 使用 huggingface 的标记器手动填充 BatchEncodings 列表