我有一个基于JSON数据的 JasperReports 报告。我正在尝试添加一个图表来显示" chartData"的值。阵,但没有运气。这是JSON的样子。
{ "reportingData": { "dateRange": "January 1, 2014-January 31, 2014", "name" : "Name Goes Here" , "chartData" : [ { "name" : "Industry 1", "value" : "10" } , { "name" : "Industry 2", "value" : "20" } , { "name" : "Industry 3", "value" : "30" } , { "name" : "Industry 4", "value" : "40" } , { "name" : "Industry 5", "value" : "50" }], "pageNumber": 1, "nextPage" : "true"} }
当我将图表添加到报告中时,我已尝试将$F{chartData}
设置为关键表达式,然后将$F{name}
设置为标签,将$F{value}
设置为值,但我得到编译错误,因为它无法找到名为name或value的字段。
我还尝试设置类似于子报表的键表达式,如下所示:
((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("chartData")
但仍然没有骰子。如果您对如何使用带有 JasperReports 图表的JSON数组有任何建议,请告诉我 - 或者如果需要我需要重新格式化JSON。
==更新 - 仍然需要帮助! == 我不确定subDataSet元素应该去哪里。另外,我猜测在subDataset中我想使用chartData属性而不是日期范围,因为那是图表的数据,但我应该使用哪个类 - 仍然是java .lang.String?您建议的另一种方法几乎就是我尝试的(请参阅原始问题),除了使用chartData属性而不是reportData属性,它是整个报表的数据集。如果您有任何建议,请告诉我 - 或者是否有人可以发布使用subDataset的工作图表的XML。
==更新2 - 仍然没有运气== 感谢您的答复。我仍然无法让它发挥作用。我稍微修改了您的代码,因为您使用reportingData作为包含subDataset的字段的名称,但这是报告顶级的名称。子数据应该使用chartData字段。
这是我现在在报告中使用的内容。它显示了关于subDataset的行旁边的eclipse插件中的红色错误指示器。
<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version last-->
<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="90544f77-b050-4811-8365-51bb292ac717">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="TEST_FOR_CHART"/>
<queryString language="json">
<![CDATA[reportingData]]>
</queryString>
<subDataset name="chartData" uuid="2a00961e-0d9c-4bd2-b124-c4cad2fc24c9">
<parameter name="default_null_text" class="java.lang.String"/>
<field name="name" class="java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<field name="value" class="java.lang.String">
<fieldDescription><![CDATA[value]]></fieldDescription>
</field>
</subDataset>
<field name="dateRange" class="java.lang.String">
<fieldDescription><![CDATA[dateRange]]></fieldDescription>
</field>
<field name="name" class="java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<field name="chartData" class="java.lang.String">
<fieldDescription><![CDATA[chartData]]></fieldDescription>
</field>
<field name="pageNumber" class="java.lang.String">
<fieldDescription><![CDATA[pageNumber]]></fieldDescription>
</field>
<field name="nextPage" class="java.lang.String">
<fieldDescription><![CDATA[nextPage]]></fieldDescription>
</field>
<background>
<band splitType="Stretch"/>
</background>
<title>
<band height="79" splitType="Stretch"/>
</title>
<pageHeader>
<band height="35" splitType="Stretch"/>
</pageHeader>
<columnHeader>
<band height="61" splitType="Stretch"/>
</columnHeader>
<detail>
<band height="252" splitType="Stretch">
<pieChart>
<chart evaluationTime="Report">
<reportElement x="200" y="10" width="200" height="200" uuid="d5b01ba1-6dea-4465-b440-78b4ebf2af8d"/>
<chartTitle/>
<chartSubtitle/>
<chartLegend/>
</chart>
<pieDataset>
<keyExpression><![CDATA[((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("chartData")]]></keyExpression>
<valueExpression><![CDATA[0]]></valueExpression>
</pieDataset>
<piePlot>
<plot/>
<itemLabel/>
</piePlot>
</pieChart>
</band>
</detail>
<columnFooter>
<band height="45" splitType="Stretch"/>
</columnFooter>
<pageFooter>
<band height="54" splitType="Stretch"/>
</pageFooter>
<summary>
<band height="42" splitType="Stretch"/>
</summary>
</jasperReport>
如果您有任何建议,请与我们联系。
答案 0 :(得分:0)
这就是我想尝试的(如果不可行,请告诉我,如果可能,我会编辑我的答案)。 在开始定义字段之前,在开头和标记之前的标记后面插入.drxml中的subDataset。根据您在上面发布的JSON,我会尝试像这样定义数据集:
<subDataset name="reportingData" uuid="2a00961e-0d9c-4bd2-b124-c4cad2fc24c9">
<parameter name="default_null_text" class="java.lang.String"/>
<field name="dateRange" class="java.lang.String">
<fieldDescription><![CDATA[dateRange]]></fieldDescription>
</field>
<field name="name" class="java.lang.String">
<fieldDescription><![CDATA[name]]></fieldDescription>
</field>
<field name="chartData" class="java.lang.String">
<fieldDescription><![CDATA[chartData]]></fieldDescription>
</field>
<field name="pageNumber" class="java.lang.String">
<fieldDescription><![CDATA[pageNumber]]></fieldDescription>
</field>
<field name="nextPage" class="java.lang.String">
<fieldDescription><![CDATA[nextPage]]></fieldDescription>
</field>
</subDataset>
在定义subDataset之后,您还需要定义一个指向它的字段,您可以将其与其他字段(您可能已经拥有)放在一起。只要下面的字段存在,这些字段的顺序无关紧要:
<field name="reporting_data" class="java.lang.String">
<fieldDescription><![CDATA[reporting_data]]></fieldDescription>
</field>
然后,当您使用此数据集创建图表时,您将“使用JRDatasource表达式”。您要使用的表达式如下:
((net.sf.jasperreports.engine.data.JsonDataSource)$P{REPORT_DATA_SOURCE}).subDataSource("reporting_data")
至于要使用的类我建议尽可能保留java.lang.String。我在使用其他人方面遇到了麻烦,如果你使用的是其他东西而不是java.lang.String,那么根据你将数据传递给jasperPrint的方式你可能会遇到错误。