饼图显示错误的键值
Pie chart is showing wrong value for key
我正在开发一个程序来创建一个报告,其中包含存储在数据库中的不同人员的数据。
报告创建正确,但图表不正确。我试图展示职业的分布。
这是我的报告:
如你所见,所有职业的计数都是一样的。这是错误的,因为 Cantante 和 Profesor 出现了两次。
我在iReport中定义图表的方式如下:
如何解决?
看起来您正在使用 net.sf.jasperreports.chart.pie.ignore.duplicated.key 属性 但忘记了对数据集中的数据进行排序。
如果您在 JasperReports 使用群组,您应该始终记住数据排序。
看来您只需要按专业字段对数据进行排序。
使用 Jaspersoft Studio 7.1.0
构建的示例
数据源
例如,使用简单的 csv 数据源 就足够了。
我的professions.csv文件的内容很简单。第一行用于字段名称。
name,age,profession
Miguel,25,Professor
Toni,22,Engineer
Josefa,34,Singer
Andres,27,Mechanic
Jony,41,Professor
Lola,33,Singer
dataadapter 在 JSS 的名称对于我的示例将是 professions.csv.
报表模板,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="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>
这个例子的主要特点是:
-
使用分组 专业领域
并按此(专业)字段应用排序。
如果 并非所有 专业 字段的值都是唯一 你会得到一个错误:
net.sf.jasperreports.engine.JRRuntimeException: Key Professor is duplicated in pie dataset.
使用 net.sf.jasperreports.chart.pie.ignore.duplicated.key 属性 允许我们构建报告,即使使用 [= 计算的重复值64=]键表达式:
<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"/>
我们会得到正确的结果:
我正在开发一个程序来创建一个报告,其中包含存储在数据库中的不同人员的数据。
报告创建正确,但图表不正确。我试图展示职业的分布。
这是我的报告:
如你所见,所有职业的计数都是一样的。这是错误的,因为 Cantante 和 Profesor 出现了两次。
我在iReport中定义图表的方式如下:
如何解决?
看起来您正在使用 net.sf.jasperreports.chart.pie.ignore.duplicated.key 属性 但忘记了对数据集中的数据进行排序。
如果您在 JasperReports 使用群组,您应该始终记住数据排序。
看来您只需要按专业字段对数据进行排序。
使用 Jaspersoft Studio 7.1.0
构建的示例数据源
例如,使用简单的 csv 数据源 就足够了。
我的professions.csv文件的内容很简单。第一行用于字段名称。
name,age,profession
Miguel,25,Professor
Toni,22,Engineer
Josefa,34,Singer
Andres,27,Mechanic
Jony,41,Professor
Lola,33,Singer
dataadapter 在 JSS 的名称对于我的示例将是 professions.csv.
报表模板,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="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>
这个例子的主要特点是:
使用分组 专业领域
并按此(专业)字段应用排序。
如果 并非所有 专业 字段的值都是唯一 你会得到一个错误:
net.sf.jasperreports.engine.JRRuntimeException: Key Professor is duplicated in pie dataset.
使用 net.sf.jasperreports.chart.pie.ignore.duplicated.key 属性 允许我们构建报告,即使使用 [= 计算的重复值64=]键表达式:
<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"/>
我们会得到正确的结果: