1

我想将水平条形图拆分为多个页面,因为类别表达式数据集在 200 左右很大,这导致图表的格式不可读。

我想要类似的东西,将类别表达式数据集分布在 15 个块中,以便在 page1 中显示前 15 个类别,依此类推。我想知道,如果它在JasperReports Server中使用iReport Professional 4.5.0可行。

4

2 回答 2

4

您可以利用报告组来实现这一点。在 iReport 中打开您的报告。报告查询是主要的报告查询,在我的示例中,我将引用两个字段:cat作为类别和val作为值。

  • 在报告检查器中右键单击报告并选择Add Report Group。按照向导,设置名称(例如splitter)并选择Group by the following expression并输入$V{REPORT_COUNT} - 1 - ( ($V{REPORT_COUNT} - 1) % 15 )。单击下一步并选择添加组页脚
  • 将图表元素从 Palette 拖放到组页脚区域的报表设计器中。选择条形图,按照向导:
    • 选择Main report dataset,单击 Next。
    • 将系列表达式更改为您需要的(例如"Sample"),单击下一步。
    • 将类别表达式设置为$F{cat},将值表达式设置为$F{val}。单击完成。向导关闭,图表现在已在报告中配置。
  • 右键单击图表,单击图表数据。在 Dataset 面板中,将 Reset type 设置为Group,选择作为 Reset Group 您的组(例如splitter)。单击关闭。

建议 1:选择图表并在 Properties 面板中滚动到Range Axis Max Value Expression,在那里设置图表的最大值。这将确保所有图表都具有相同的比例。在随附的示例中,我将其静态设置为 100,最好通过数据库查询提供最大值。

建议 2:当您运行报告时,您可能会注意到最后一个条形图可能看起来不同,因为 JasperReports/jfreechart 根据类别数缩放条形的宽度。要为条形图设置静态宽度,您需要创建一个图表定制器,将固定宽度设置为单个条形。

我附加了一个示例输出,我在示例数据集上将拆分器值设置为 3。 报告输出

我还附上了 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="report5" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="271b22ae-bc2f-4da1-a499-e41a8f4252b2">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <parameter name="splitBy" class="java.lang.Integer">
        <defaultValueExpression><![CDATA[3]]></defaultValueExpression>
    </parameter>
    <queryString>
        <![CDATA[select val, cat from (
select 15 as val, "A" as cat
union select 65 as val, "B" as cat
union select 34 as val, "C" as cat
union select 99 as val, "D" as cat
union select 67 as val, "E" as cat
union select 23 as val, "F" as cat
union select 76 as val, "G" as cat
union select 23 as val, "H" as cat
union select 56 as val, "I" as cat
union select 11 as val, "J" as cat
union select 23 as val, "K" as cat
union select 5 as val, "L" as cat
union select 11 as val, "M" as cat
union select 15 as val, "N" as cat
union select 12 as val, "O" as cat
union select 13 as val, "P" as cat
) tbl group by cat
]]>
    </queryString>
    <field name="val" class="java.lang.Long"/>
    <field name="cat" class="java.lang.String"/>
    <group name="splitter">
        <groupExpression><![CDATA[$V{REPORT_COUNT} - 1 - ( ($V{REPORT_COUNT} - 1) % $P{splitBy} ) ]]></groupExpression>
        <groupFooter>
            <band height="154">
                <barChart>
                    <chart>
                        <reportElement uuid="e046c83e-11c5-4f3a-adfb-a540024400f5" x="0" y="0" width="555" height="154"/>
                        <chartTitle/>
                        <chartSubtitle/>
                        <chartLegend/>
                    </chart>
                    <categoryDataset>
                        <dataset resetType="Group" resetGroup="splitter"/>
                        <categorySeries>
                            <seriesExpression><![CDATA["Sample"]]></seriesExpression>
                            <categoryExpression><![CDATA[$F{cat}]]></categoryExpression>
                            <valueExpression><![CDATA[$F{val}]]></valueExpression>
                        </categorySeries>
                    </categoryDataset>
                    <barPlot>
                        <plot/>
                        <itemLabel/>
                        <rangeAxisMaxValueExpression><![CDATA[100]]></rangeAxisMaxValueExpression>
                    </barPlot>
                </barChart>
            </band>
        </groupFooter>
    </group>
</jasperReport>
于 2013-01-25T11:07:06.487 回答
2

您可以使用 Groups 来添加组并在添加组时添加条件。

    $V{REPORT_COUNT} - 1 - ( ($V{REPORT_COUNT} - 1) % 10 )
于 2013-04-01T11:53:53.217 回答