2016-09-18 182 views
0

我有一个JSON数据与以下结构如何遍历JSON阵列来创建JasperReports的重复报告

[{ 
"a1":"b1", 
"a2":"b2", 
"details1":[{"a1":"b1"}], 
"details2":[{"a2":"b2"}], 
}, 
{ 
"a1":"b1", 
"a2":"b2", 
"details1":[{"a1":"b1"}], 
"details2":[{"a2":"b2"}], 
}, 
{ 
"a1":"b1", 
"a2":"b2", 
"details1":[{"a1":"b1"}], 
"details2":[{"a2":"b2"}], 
}] 

我已创建和详情1阵列details2单独的报告。 另外,我已经为主表中的一个元素创建了一个报告,将detail1和detail2报告作为子报表进行报告。

问题是主要报告仅从第一个元素打印a1和a2,然后从所有元素的所有details1和details2表中打印所有元素。

我的目标是创建一个报表,它将从主表的第一个元素,第二个元素等打印出a1,a2,details1,details2。我怎样才能达到目的?

换句话说,我如何在JSON数组上迭代相同的报表模板?

+1

你可以告诉你是什么结果,你想获得一个例子?所以我们明白究竟是你的问题是什么,通常你创建一个新的数据源使用subDataSource,请参阅[如何使用json获取动态数量的表](http://stackoverflow.com/questions/33778753/how-to-get-dynamic-no-of-tables-using-json)和[Jasper subreport当嵌入标题带时,只显示JSON数据源中的一个条目](http://stackoverflow.com/questions/39399255/) –

+0

嗨,彼得。感谢您的建议。我设法通过将所有内容(静态,动态字段和两个子报表)放入自定义组的报告中来解决我的问题。我不确定我是否应该发布答案或只是删除我的问题。 ? – freefall

+0

我认为你应该改善你的问题和发布答案(特别是因为其他用户发布的答案),尽量使它对未来的用户有用,因此任何人都可以回答没有意见和你如何解决它的一个很好的答案的问题。如果你没有足够的能量,那么也许我们可以把它作为重复来关闭(我个人不喜欢删除其他用户用来回答的东西) –

回答

4

您不必为了达到嵌套数组而创建子报表。更简单的解决方案是使用subDataset

在你的情况,你需要在你的JSON源创建的每个细节键子数据:

<subDataset name="details1" uuid="4563e834-a9e5-43b5-9f0a-824948c73c73"> 
    <field name="A1" class="java.lang.String"> 
    <fieldDescription><![CDATA[a1]]></fieldDescription> 
    </field> 
</subDataset> 
<subDataset name="details2" uuid="f703cb76-2a4a-44f1-9a42-227e180038d2"> 
    <field name="A2" class="java.lang.String"> 
    <fieldDescription><![CDATA[a2]]></fieldDescription> 
    </field> 
</subDataset> 

你的主要查询是为了遍历主JSON源中的每个对象设置为空:

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

然后您需要使用知道如何处理像表或列表这样的子数据集的结构。我在这里选择一个列表,因为它更容易处理。对于第一子数据,你将不得不:

<componentElement> 
    <reportElement x="90" y="40" width="333" height="20" uuid="c3237c70-6b2e-43e3-aa21-5092d8b91afc"/> 
    <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="details1" uuid="f5fdc6a3-736f-43ce-b549-cd7332d19eb8"> 
     <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("details1")]]></dataSourceExpression> 
    </datasetRun> 
    <jr:listContents height="20" width="333"> 
     <textField> 
     <reportElement x="10" y="0" width="130" height="20" uuid="07e3ff2a-3832-4b06-9275-cb1ee8e51cfe"/> 
     <textFieldExpression><![CDATA[$F{A1}]]></textFieldExpression> 
     </textField> 
    </jr:listContents> 
    </jr:list> 
</componentElement> 

对于第二子数据列表组件是相同的。

下面是一个简单的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="Report" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="81afe112-ee1b-4443-8d1c-cb6d9ab95dd8"> 
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="JsonArrayDataAdapter.xml"/> 
    <subDataset name="details1" uuid="4563e834-a9e5-43b5-9f0a-824948c73c73"> 
    <field name="A1" class="java.lang.String"> 
     <fieldDescription><![CDATA[a1]]></fieldDescription> 
    </field> 
    </subDataset> 
    <subDataset name="details2" uuid="f703cb76-2a4a-44f1-9a42-227e180038d2"> 
    <field name="A2" class="java.lang.String"> 
     <fieldDescription><![CDATA[a2]]></fieldDescription> 
    </field> 
    </subDataset> 
    <queryString language="json"> 
    <![CDATA[]]> 
    </queryString> 
    <field name="A1" class="java.lang.String"> 
    <fieldDescription><![CDATA[a1]]></fieldDescription> 
    </field> 
    <field name="A2" class="java.lang.String"> 
    <fieldDescription><![CDATA[a2]]></fieldDescription> 
    </field> 
    <detail> 
    <band height="99" splitType="Stretch"> 
     <textField> 
     <reportElement x="72" y="16" width="100" height="24" uuid="698866c8-7d26-4bc7-8727-b4a56d239a53"/> 
     <textFieldExpression><![CDATA[$F{A1}]]></textFieldExpression> 
     </textField> 
     <textField> 
     <reportElement x="190" y="16" width="100" height="24" uuid="e775c6c0-4058-4bc4-8c7a-d4d381fd6e66"/> 
     <textFieldExpression><![CDATA[$F{A2}]]></textFieldExpression> 
     </textField> 
     <componentElement> 
     <reportElement x="90" y="40" width="333" height="20" uuid="c3237c70-6b2e-43e3-aa21-5092d8b91afc"/> 
     <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="details1" uuid="f5fdc6a3-736f-43ce-b549-cd7332d19eb8"> 
      <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("details1")]]></dataSourceExpression> 
      </datasetRun> 
      <jr:listContents height="20" width="333"> 
      <textField> 
       <reportElement x="10" y="0" width="130" height="20" uuid="07e3ff2a-3832-4b06-9275-cb1ee8e51cfe"/> 
       <textFieldExpression><![CDATA[$F{A1}]]></textFieldExpression> 
      </textField> 
      </jr:listContents> 
     </jr:list> 
     </componentElement> 
     <componentElement> 
     <reportElement x="90" y="60" width="333" height="20" uuid="38f3ac11-ad3e-464c-813a-46132f23783f"/> 
     <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="details2" uuid="833a13c3-e9b8-4f56-9f8f-279d32d403e8"> 
      <dataSourceExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("details2")]]></dataSourceExpression> 
      </datasetRun> 
      <jr:listContents height="20" width="333"> 
      <textField> 
       <reportElement x="10" y="0" width="130" height="20" uuid="3d9fb513-bfc9-4d95-a3da-16b95cf15e7c"/> 
       <textFieldExpression><![CDATA[$F{A2}]]></textFieldExpression> 
      </textField> 
      </jr:listContents> 
     </jr:list> 
     </componentElement> 
    </band> 
    </detail> 
</jasperReport>