1

我想在 Jasper iReport 中为每组使用一个饼图,但我不知道如何为每组创建一个数据集。

假设我有一个如下表:

Table users
---------
category - user - status

然后我有以下SQL

select * from users order by category

我的显示器有一个简单的类别组带,其中详细显示了每个用户及其状态。理想情况下,我会让每个类别组标题显示一个饼图,其中包含该组中所有不同的状态及其计数。我不知道如何在 iReport 中执行此操作。

如果我提前知道所有类别,我可以使用以下内容为每个类别创建一个数据集:

select status, count(user) from user where category = <current category> group by status

我正在尝试使用JRMapCollectionDataSource重置每个组并使用变量从组中的行中提取数据来执行此操作,但我对整个重置组和增量范例不是很熟悉。

有什么帮助吗?

4

1 回答 1

4

您无需按照以下步骤进行编程即可解决此问题:

  1. 按类别字段和用户字段对数据进行排序(通过iReport添加排序或在查询中添加ORDER BY子句以防处理jdbc 数据源);
  2. 添加两组:第一组 - 用于类别字段,第二组 - 用于用户字段(通过iReport)。注意:不一定要在查询中添加GROUP BY子句;
  3. 饼图组件添加到类别字段的组标题带;
  4. 为此pieChart设置评估时间和评估组属性。

这是演示如何构建饼图的工作示例。在此示例中,我使用csv文件作为数据源。

该图表显示了每个类别的用户数量。我使用变量usersCount来计算每个组中的用户,但可以使用内置变量。$V{userGroup_COUNT}

这是我的jrxml文件:

<?xml version="1.0" encoding="UTF-8"?>
<jasperReport ...>
    <field name="category" class="java.lang.Integer"/>
    <field name="user" class="java.lang.String"/>
    <field name="status" class="java.lang.String"/>
    <sortField name="category"/>
    <sortField name="user"/>
    <variable name="usersCount" class="java.lang.Integer" resetType="Group" resetGroup="userGroup" calculation="Count">
        <variableExpression><![CDATA[$F{user}]]></variableExpression>
        <initialValueExpression><![CDATA[0]]></initialValueExpression>
    </variable>
    <group name="categoryGroup">
        <groupExpression><![CDATA[$F{category}]]></groupExpression>
        <groupHeader>
            <band height="135">
                <pieChart>
                    <chart evaluationTime="Group" evaluationGroup="categoryGroup">
                        <reportElement x="158" y="0" width="200" height="135"/>
                        <chartTitle/>
                        <chartSubtitle/>
                        <chartLegend/>
                    </chart>
                    <pieDataset>
                        <dataset resetType="Group" resetGroup="categoryGroup" incrementType="Group" incrementGroup="userGroup"/>
                        <keyExpression><![CDATA[$F{user}]]></keyExpression>
                        <valueExpression><![CDATA[$V{usersCount}]]></valueExpression>
                        <labelExpression><![CDATA[String.valueOf($V{usersCount})]]></labelExpression>
                    </pieDataset>
                    <piePlot>
                        <plot/>
                        <itemLabel/>
                    </piePlot>
                </pieChart>
                <textField>
                    <reportElement x="0" y="0" width="100" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA["Category: " + $F{category}]]></textFieldExpression>
                </textField>
            </band>
        </groupHeader>
    </group>
    <group name="userGroup">
        <groupExpression><![CDATA[$F{user}]]></groupExpression>
    </group>
    <title>
        <band height="79" splitType="Stretch"/>
    </title>
</jasperReport>

这是我的csv文件(数据文件 -数据源):

category,user,status
1,user1,WORK
1,user1,HOLIDAY
1,user2,SICK
2,user1,WORK
2,user2,WORK
2,user2,HOLIDAY
2,user3,HOLIDAY
2,user4,SICK
3,user1,HOLIDAY
3,user3,HOLIDAY
3,user5,HOLIDAY
4,user1,WORK
4,user1,HOLIDAY
4,user2,SICK
4,user2,WORK
4,user2,SICK
4,user3,HOLIDAY
4,user4,HOLIDAY
4,user5,HOLIDAY

结果将是(通过iReport预览):

结果

于 2012-09-24T10:37:14.943 回答