【问题标题】:How to get dynamic no of tables using json如何使用json获取动态表数
【发布时间】:2015-11-18 11:22:09
【问题描述】:

我想创建带有动态表数的 Jasper 报告。
例如:

  • 用户 1 - 5 个表
  • 用户 2 - 3 个表
  • 用户 3 - 6 个表

我尝试使用列表选项,但我的表格不可见并且页数越来越多。

<subDataset name="tableDataSet" uuid="c72d8dbd-d63e-411b-862d-a0d6e1e25d37">
        <queryString language="json">
            <![CDATA[tableData]]>
        </queryString>
        <field name="description" class="java.lang.String">
            <fieldDescription><![CDATA[description]]></fieldDescription>
        </field>
</subDataset>
<subDataset name="listDataSet" uuid="c72d8dbd-d63e-411b-862d-a0d6e1e25d37">
        <queryString language="json">
            <![CDATA[listData]]>
        </queryString>
        <field name="tableData" class="java.lang.String">
        <fieldDescription><![CDATA[tableData]]></fieldDescription>
    </field>
</subDataset>
<queryString language="json">
        <![CDATA[mainDataSet]]>
</queryString>
<field name="listData" class="java.lang.String">
    <fieldDescription><![CDATA[listData]]></fieldDescription>
</field>
<componentElement>
<reportElement x="-1" y="170" width="830" height="150" uuid="ab0272db-d740-42c9-94e5-238a2cc4a63e"/>
<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="listDataSet" uuid="f80306fb-80fc-405b-b90d-f9fe6b6ee2e1">
    <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("listData")]]></dataSourceExpression>
</datasetRun>
<jr:listContents height="150" width="830">
    <componentElement>
<reportElement positionType="Float" x="0" y="67" width="825" height="76" uuid="6a8e89c4-d4ea-4d8f-b932-8fbb24d00725"/>
<jr:table>
    <datasetRun subDataset="tableDataSet" uuid="6ab7d349-34c8-4db7-bf3c-4e638ca36f5c">
        <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("tableData")]]></dataSourceExpression>
    </datasetRun>
    <jr:column width="100" uuid="aae649c4-6a69-485f-8a0d-87022df793ee">
    <jr:columnHeader style="colBotLeftLine" height="30">
        <staticText>
        <reportElement x="0" y="0" width="100" height="30" uuid="795dac43-0ff0-482c-89a0-7dac3b27d513"/>
        <textElement>
            <font isBold="true"/>
        </textElement>
        <text><![CDATA[DESCRIPTION]]></text>
        </staticText>
    </jr:columnHeader>
    <jr:columnFooter style="footerBotLeftLine" height="20">
        <staticText>
        <reportElement x="0" y="0" width="100" height="20" uuid="795dac43-0ff0-482c-89a0-7dac3b27d513"/>
        <textElement>
            <font isBold="true"/>
        </textElement>
        <text><![CDATA[Grand Total]]></text>
        </staticText>
    </jr:columnFooter>
    <jr:detailCell height="20" rowSpan="1">
        <textField>
        <reportElement x="0" y="0" width="100" height="20" uuid="734834e8-5896-4355-9454-6b188e86bfff"/>
        <textFieldExpression><![CDATA[$F{description}]]></textFieldExpression>
        </textField>
        </jr:detailCell>
    </jr:column>
</jr:table>
</componentElement>
</jr:listContents>
</jr:list>
</componentElement>

Json 数据。

{mainDataSet :
 [
  {CompanyName : "XYZ",
   listData:
    [
     {tableId:1,
      tableName:"Table One",
      tableData:
        [
        {description:"Table One Row Data One "},
        {description:"Table One Row Data Two"}
        ]
     },
     {tableId:2,
      tableName:"Table Two",
      tableData:
        [
        {description:"Table Two Row Data One "},
        {description:"Table Two Row Data Two"}
        ]
     }
    ]
  }
 ]
}

mainDataSet 是我的报告数据集,listData 是列表数据,tableData 是我要在表格中显示的数据。
注意
如果我删除了

<dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("tableData")]]></dataSourceExpression>

然后放

<dataSourceExpression><![CDATA[new net.sf.jasperreports.engine.JREmptyDataSource()]]></dataSourceExpression>

然后用空值创建两个表。

【问题讨论】:

  • 问题是……?
  • 可能 .subDataSource("tableValues") 是错误的,但如果您不同时发布 ListDataSet 和数据示例,则无法回答。
  • @PetterFriberg 我已经用 listDataSet 和 JSON 数据更新了问题
  • 好的,我已经使用该数据源发布并回答了......你确定它是一样的???还是除此之外还有其他标签??

标签: json jasper-reports


【解决方案1】:

对主报表的查询让我们将其留空(并保留 mainDataSet 节点)

<queryString language="json"><![CDATA[]]></queryString>

CompanyName 字段定义为

<field name="CompanyName" class="java.lang.String">
    <fieldDescription><![CDATA[mainDataSet[0].CompanyName]]></fieldDescription>
</field>

dataSourceExpression 传递给jr:list

<datasetRun subDataset="listDataSet" uuid="71276e30-7777-44ae-b6d9-2087a4c51ca3">
   <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("mainDataSet.listData")]]></dataSourceExpression>
</datasetRun>

因此指向mainDataSet.listData

dataSourceExpression 传递给表(我们现在在listData

<datasetRun subDataset="tableDataSet" uuid="5bca90cb-1473-4ff6-82fc-1da5ae4fb44c">
    <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("tableData")]]></dataSourceExpression>
</datasetRun>

【讨论】:

  • 但我不能将主报表查询留空。我需要显示公司名称
  • 如何将 JsonDataSource 传递给主报告?
  • &lt;queryString language="json"&gt;&lt;![CDATA[mainDataSet]]&gt;&lt;/queryString&gt; 提供了公司名称。
  • 我的意思是从 java 你是如何传递 JsonDataSource...标签之前,你在java中做什么?
  • InputStream is = new ByteArrayInputStream( jsonStr.getBytes()); JsonDataSource ds = new JsonDataSource(is,"mainDataSet"); 我正在通过提供mainDataSet 名称来填充数据
猜你喜欢
  • 2016-01-10
  • 2019-07-20
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2020-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多