如何将图表拆分成多个页面,如JasperReports Server中的交叉表?

时间:2013-01-25 06:39:30

标签: jasper-reports jasperserver

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

我希望类似表达式数据集以15块为单位进行分配, 至于在page1中显示前15个类别,依此类推。我想知道,如果使用 iReport Professional 4.5.0 JasperReports Server 中可行。

2 个答案:

答案 0 :(得分:3)

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

  • 在报告检查器中右键单击报告,然后选择添加报告组。按照向导设置名称(例如拆分器)并按以下表达式选择并输入$V{REPORT_COUNT} - 1 - ( ($V{REPORT_COUNT} - 1) % 15 )。单击下一步,然后选择添加组页脚
  • 将图表元素从Palette拖放到组页脚区域的报表设计器中。选择条形图,按照向导:
    • 选择主报表数据集,单击“下一步”。
    • 将系列表达式更改为您需要的内容(例如"Sample"),单击“下一步”。
    • 将类别表达式设置为$F{cat},将值表达式设置为$F{val}。单击完成。向导关闭,现在在报告中配置了图表。
  • 右键单击图表,单击图表数据。在“数据集”面板中将“重置类型”设置为,选择“重置组”组(例如拆分器)。点击关闭。

建议1 :选择图表并在“属性”面板中滚动到范围轴最大值表达式,在那里设置图表的最大值。这将确保所有图表具有相同的比例。在附带的示例中,我将其静态设置为100,通过数据库查询提供最大值也是很好的。

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

我附加了一个示例输出,其中我将样本数据集上的拆分器值设置为3。 report output

我还附上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>

答案 1 :(得分:1)

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

    $V{REPORT_COUNT} - 1 - ( ($V{REPORT_COUNT} - 1) % 10 )