我正在开发一个程序,该程序使用存储在数据库中的不同人员的数据创建报告。
报表创建良好,但是图表不正确。我试图显示职业分布。
这是我的报告:
如您所见,所有职业都有相同的人数。这是错误的,因为Cantante和Profesor出现了两次。
我通过以下方式在iReport中定义图表:
如何解决?
答案 0 :(得分:1)
看起来您正在使用 net.sf.jasperreports.chart.pie.ignore.duplicated.key 属性,但是忘记了对数据集的数据进行排序。
如果在 JasperReports 中使用组,则应始终记住有关数据排序的信息。
您所需要做的只是按照 专业 字段对数据进行排序。
使用简单的 csv数据源就足够了。
professions.csv 文件的内容非常简单。第一行用于字段名称。
name,age,profession
Miguel,25,Professor
Toni,22,Engineer
Josefa,34,Singer
Andres,27,Mechanic
Jony,41,Professor
Lola,33,Singer
在 JSS 中, dataadapter 的名称为 professions.csv 。
我使用饼图上的主要数据集来显示信息。
<?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="NotSortedDataChart" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="09483b77-da8e-4dbb-a87d-ae46c27df140">
<property name="com.jaspersoft.studio.data.defaultdataadapter" value="professions.csv"/>
<property name="net.sf.jasperreports.chart.pie.ignore.duplicated.key" value="true"/>
<field name="name" class="java.lang.String"/>
<field name="age" class="java.lang.String"/>
<field name="profession" class="java.lang.String"/>
<sortField name="profession"/>
<group name="ProfessionGroup">
<groupExpression><![CDATA[$F{profession}]]></groupExpression>
</group>
<columnHeader>
<band height="15" splitType="Stretch">
<staticText>
<reportElement x="0" y="0" width="120" height="15" uuid="edda065f-1a67-4f94-a2e9-1fc0042e4d32"/>
<textElement textAlignment="Left" verticalAlignment="Middle">
<font isBold="true"/>
</textElement>
<text><![CDATA[Name]]></text>
</staticText>
<staticText>
<reportElement x="120" y="0" width="145" height="15" uuid="95bf7063-fe77-48d6-924a-e0028b8ec0c4"/>
<textElement textAlignment="Left" verticalAlignment="Middle">
<font isBold="true"/>
</textElement>
<text><![CDATA[Age]]></text>
</staticText>
<staticText>
<reportElement x="245" y="0" width="125" height="15" uuid="97f91177-abd3-416d-abb1-e8692f96dc5c"/>
<textElement textAlignment="Left" verticalAlignment="Middle">
<font isBold="true"/>
</textElement>
<text><![CDATA[Profession]]></text>
</staticText>
</band>
</columnHeader>
<detail>
<band height="15" splitType="Stretch">
<textField>
<reportElement x="0" y="0" width="120" height="15" uuid="b10df174-e36e-402d-ad52-4aa15dbebd49"/>
<textFieldExpression><![CDATA[$F{name}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="120" y="0" width="125" height="15" uuid="5c66bca9-34af-49a6-a4fe-87c4e945f31b"/>
<textFieldExpression><![CDATA[$F{age}]]></textFieldExpression>
</textField>
<textField>
<reportElement x="245" y="0" width="145" height="15" uuid="d169f529-349c-4c84-b697-680048eabd94"/>
<textFieldExpression><![CDATA[$F{profession}]]></textFieldExpression>
</textField>
</band>
</detail>
<summary>
<band height="240" splitType="Stretch">
<pieChart>
<chart evaluationTime="Report">
<reportElement x="50" y="40" width="200" height="200" uuid="7454b149-6176-4070-8f9b-dd10bbd8f47a"/>
<chartTitle/>
<chartSubtitle/>
<chartLegend/>
</chart>
<pieDataset>
<keyExpression><![CDATA[$F{profession}]]></keyExpression>
<valueExpression><![CDATA[$V{ProfessionGroup_COUNT}]]></valueExpression>
<labelExpression><![CDATA[$V{ProfessionGroup_COUNT}.toString()]]></labelExpression>
</pieDataset>
<piePlot>
<plot/>
<itemLabel/>
</piePlot>
</pieChart>
</band>
</summary>
</jasperReport>
此示例的主要功能是:
按专业 字段
,并根据此( profession )字段应用排序。
如果专业 字段的不是全部值是唯一,您将收到错误消息:
net.sf.jasperreports.engine.JRRuntimeException: Key Professor is duplicated in pie dataset.
使用 net.sf.jasperreports.chart.pie.ignore.duplicated.key 属性,即使使用 key 表达式计算出的重复值,我们也可以构建报告:
<keyExpression><![CDATA[$F{profession}]]></keyExpression>
<valueExpression><![CDATA[$V{ProfessionGroup_COUNT}]]></valueExpression>
<labelExpression><![CDATA[$V{ProfessionGroup_COUNT}.toString()]]></labelExpression>
如果不对数据进行排序(只需从 jrxml 中删除<sortField name="profession"/>
行),结果将是错误的,就像您的屏幕截图所示:
应用排序后,例如在代码的帮助下
<sortField name="profession"/>
我们将得到正确的结果: