如何在Jasper Reports 3D柱状图中显示总和数值?

3
我想创建一个3D条形图,按类型分组,并显示每种类型的平方英尺值之和。但无法让条形图按颜色显示每种类型的平方英尺值之和。相反,当同一类型和颜色有多个平方英尺值时,似乎只显示最后一个平方英尺值的值。

data

current chart

<?xml version="1.0" encoding="UTF-8"?>
<!-- Created with Jaspersoft Studio version 6.6.0.final using JasperReports Library version 6.6.0  -->
<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="barChart" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4f80af00-8345-4feb-bd0c-5b0b3b2b6232">
    <property name="com.jaspersoft.studio.data.sql.tables" value=""/>
    <property name="com.jaspersoft.studio.data.defaultdataadapter" value="hsqlCon"/>
    <queryString language="SQL">
        <![CDATA[select * from Item where id IN (select itemId from TempItem )]]>
    </queryString>
    <field name="COLOR" class="java.lang.String">
        <property name="com.jaspersoft.studio.field.label" value="COLOR"/>
        <property name="com.jaspersoft.studio.field.tree.path" value="ITEM"/>
    </field>
    <field name="SQUAREFEET" class="java.lang.Double">
        <property name="com.jaspersoft.studio.field.label" value="SQUAREFEET"/>
        <property name="com.jaspersoft.studio.field.tree.path" value="ITEM"/>
    </field>
    <field name="TYPE" class="java.lang.String">
        <property name="com.jaspersoft.studio.field.label" value="TYPE"/>
        <property name="com.jaspersoft.studio.field.tree.path" value="ITEM"/>
    </field>
    <group name="TYPE">
        <groupExpression><![CDATA[$F{TYPE}]]></groupExpression>
    </group>
    <background>
        <band splitType="Stretch"/>
    </background>
    <title>
        <band height="79" splitType="Stretch"/>
    </title>
    <pageHeader>
        <band height="35" splitType="Stretch"/>
    </pageHeader>
    <detail>
        <band height="257" splitType="Stretch">
            <bar3DChart>
                <chart evaluationTime="Report">
                    <reportElement x="139" y="0" width="581" height="257" uuid="f2ceb018-5078-4aeb-90df-125419604d39"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <categoryDataset>
                    <categorySeries>
                        <seriesExpression><![CDATA[$F{COLOR}]]></seriesExpression>
                        <categoryExpression><![CDATA[$F{TYPE}]]></categoryExpression>
                        <valueExpression><![CDATA[SUM($F{SQUAREFEET})]]></valueExpression>
                    </categorySeries>
                </categoryDataset>
                <bar3DPlot>
                    <plot/>
                    <itemLabel/>
                    <categoryAxisFormat>
                        <axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
                    </categoryAxisFormat>
                    <valueAxisFormat>
                        <axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
                    </valueAxisFormat>
                </bar3DPlot>
            </bar3DChart>
        </band>
    </detail>
    <pageFooter>
        <band height="54" splitType="Stretch"/>
    </pageFooter>
</jasperReport>

你能发一些Java代码片段吗?我不明白到底哪里出了问题。 - iamrajshah
@iamrajshah,我真的不太理解你的评论,我已经删除了Java标签,以澄清这是Jasper Reports库,它确实是使用Java开发和使用的,但实际上您并不需要编写Java代码,因为报表是从jrxml(xml)文件中使用各种类型的数据源生成的。 - Petter Friberg
@PetterFriberg 这就是为什么由于 Java 标签而导致混淆的原因。明白了。 - iamrajshah
1个回答

3

注意:我建议在你的示例中所有计算都应该在SQL查询中完成,例如:SELECT TYPE, COLOR, SUM(SQUAREFEET) AS SQUAREFEET FROM Item WHERE id IN (SELECT itemId FROM TempItem) GROUP BY TYPE, COLOR。这将为您提供一个“平面”的数据源,您不需要在jasper-report中添加组、变量等,而且检索到的数据较少,这将减少报告的执行时间。下面的示例通过使用组和变量创建图表,假定您的数据按TYPECOLOR排序(在jasper报告中分组仅在您有序排列的数据上起作用)。

一些关键点/快速提示,在完整示例之前

图表应放置在摘要段中,详细段会针对每条记录执行,而我们希望为所有记录创建1个图表。

您的分组既基于TYPE又基于COLOR(当其中一个发生变化时,您就有了一个新组),因此分组表达式需要类似于:

<group name="TYPE_COLOR">
   <groupExpression><![CDATA[$F{TYPE}+"_"+$F{COLOR}]]></groupExpression>
</group>

我们需要一个变量来收集我们求和的值(在组更改时重置),这将在类别系列值表达式中使用。
<variable name="SUM_SQUAREFEET" class="java.lang.Double" resetType="Group" resetGroup="TYPE_COLOR" calculation="Sum">
        <variableExpression><![CDATA[$F{SQUAREFEET}]]></variableExpression>
</variable>

我们需要告诉图表何时收集数据(何时向图表添加数据)。

<dataset incrementType="Group" incrementGroup="TYPE_COLOR"/>

完整的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="barChart" pageWidth="842" pageHeight="595" orientation="Landscape" columnWidth="802" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="4f80af00-8345-4feb-bd0c-5b0b3b2b6232">
    <queryString language="SQL">
    <![CDATA[select * from Item where id IN (select itemId from TempItem )]]>
    </queryString>
    <field name="TYPE" class="java.lang.String"/>
    <field name="COLOR" class="java.lang.String"/>
    <field name="SQUAREFEET" class="java.lang.Double"/>
    <variable name="SUM_SQUAREFEET" class="java.lang.Double" resetType="Group" resetGroup="TYPE_COLOR" calculation="Sum">
        <variableExpression><![CDATA[$F{SQUAREFEET}]]></variableExpression>
    </variable>
    <group name="TYPE_COLOR">
        <groupExpression><![CDATA[$F{TYPE}+"_"+$F{COLOR}]]></groupExpression>
    </group>
    <summary>
        <band height="267">
            <bar3DChart>
                <chart>
                    <reportElement x="90" y="10" width="581" height="257" uuid="bcbac117-a9ab-424c-ae81-6f68d1b01f0c"/>
                    <chartTitle/>
                    <chartSubtitle/>
                    <chartLegend/>
                </chart>
                <categoryDataset>
                    <dataset incrementType="Group" incrementGroup="TYPE_COLOR"/>
                    <categorySeries>
                        <seriesExpression><![CDATA[$F{COLOR}]]></seriesExpression>
                        <categoryExpression><![CDATA[$F{TYPE}]]></categoryExpression>
                        <valueExpression><![CDATA[$V{SUM_SQUAREFEET}]]></valueExpression>
                    </categorySeries>
                </categoryDataset>
                <bar3DPlot>
                    <plot/>
                    <itemLabel/>
                    <categoryAxisFormat>
                        <axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
                    </categoryAxisFormat>
                    <valueAxisFormat>
                        <axisFormat labelColor="#000000" tickLabelColor="#000000" axisLineColor="#000000"/>
                    </valueAxisFormat>
                </bar3DPlot>
            </bar3DChart>
        </band>
    </summary>
</jasperReport>

输出

output

这是一个输出示例。

非常感谢 @Petter。 - Roshana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接