【问题标题】:Grouping records in JasperReportsJasperReports 中的分组记录
【发布时间】:2017-02-01 16:35:08
【问题描述】:

我对 JasperReports 有疑问。我想根据一个特定列的值对记录进行分组。

例如输入数据:

Name--email--PledgeType--amount
aaa--aa@yahoo.com--1--20.00
bbb--bb@yahoo.com--2--30.00
ccc--cc@gmai.com--1--35.00
ddd--dd@gmai.com--2-- 40.00

输出报告将按“PledgeType”值(1、2、...数字)分组:

Total for group one: 55.00
Name email         amount
aaa  aa@yahoo.com 20.00
ccc  cc@gmai.com  35.00
------------------------------------
Total for group two: 70.00
Name email         amount
bbb  bb@yahoo.com  30.00
ddd  dd@gmai.com   40.00

JasperReports 可以解决这个问题吗?怎么样?

【问题讨论】:

  • 您可以在 SQL 查询中使用 group by 来按质押类型对数据进行分组。添加一个报告组并将页脚设置为 0px 高,将页眉设置为您需要的任意高。然后将您的“X 组总计”字段放在那里。将报告组表达式设置为pledgeType 字段。这就是我在 Jasper 1.3.x 中的做法。您可以在提取数据的 Java 中或在报告脚本中进行总计。
  • 我能再问你一个问题吗?更改标题的标签取决于值:IF [PledgeType] 1 AND 2 THEN heading = “Purpose” 所以标题是 textField 组件还是静态文本组件?
  • 如果标题是可变的,则使用textField 组件,否则staticTextField 将起作用。

标签: jasper-reports grouping


【解决方案1】:

您可以在 JasperReports 中定义分组。 JasperReports 为您计算总数,有一种添加组和总数的舒适方式。这里概述了您需要在 iReport 中执行的操作。

添加群组

  • 将您的查询修改为按承诺类型排序 - JasperReports 需要根据您的分组对数据进行排序。
  • 在报告检查器中右键单击报告并选择添加报告组
  • 按照向导,设置为组名PledgeType,然后选择按以下报告对象分组,您可以在其中选择字段PledgeType。点击下一步。勾选添加组头并点击完成

加总

  • 在报表检查器中右键单击变量并选择添加变量
  • 在属性面板中选择以下配置:变量类:BigDecimal,计算:Sum,ResetType:Group,ResetGroup PledgeType,变量表达式:$F{amount}
  • 将变量拖放到报表设计器的组标题中。单击字段并更改:文本字段表达式:"Total for group " + $F{PledgeType} + ": " + $V{totalPledge},表达式类:java.lang.String。评估时间:小组。评估组:PledgeType。

信息:评估时间决定了何时评估变量,即何时显示计算的总和。如果将其设置为组,则意味着“一旦组处理完成”。

附上生成的报告和 JRXML。

JRXML 是使用 iReport 5.0 创建的 - 但是,如果您按照上述步骤操作,它应该适用于 JR v 2+

<?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="report2" language="groovy" pageWidth="595" pageHeight="842" columnWidth="555" leftMargin="20" rightMargin="20" topMargin="20" bottomMargin="20" uuid="ce08fe1c-1543-4460-8613-7f03b200082b">
    <property name="ireport.zoom" value="1.0"/>
    <property name="ireport.x" value="0"/>
    <property name="ireport.y" value="0"/>
    <queryString>
        <![CDATA[select * from
(select 'aaa' as Name, 'aa@yahoo.com' as email, 1 as PledgeType, 20.00 as amount
union select 'bbb', 'bb@yahoo.com' ,2, 30.00
union select 'ccc', 'cc@gmai.com' ,1, 35.00
union select 'ddd', 'dd@gmai.com' ,2, 40.00) tbl
order by PledgeType]]>
    </queryString>
    <field name="Name" class="java.lang.String"/>
    <field name="email" class="java.lang.String"/>
    <field name="PledgeType" class="java.lang.Long"/>
    <field name="amount" class="java.math.BigDecimal"/>
    <variable name="totalPledge" class="java.math.BigDecimal" resetType="Group" resetGroup="PledgeType" calculation="Sum">
        <variableExpression><![CDATA[$F{amount}]]></variableExpression>
    </variable>
    <group name="PledgeType">
        <groupExpression><![CDATA[$F{PledgeType}]]></groupExpression>
        <groupHeader>
            <band height="61">
                <textField evaluationTime="Group" evaluationGroup="PledgeType">
                    <reportElement uuid="401c7b3b-af73-4d40-8982-9c1692eb7085" x="0" y="21" width="555" height="20"/>
                    <textElement/>
                    <textFieldExpression><![CDATA["Total for group " + $F{PledgeType} + ": " + $V{totalPledge}]]></textFieldExpression>
                </textField>
                <staticText>
                    <reportElement uuid="87cd0d21-014d-4e6c-a54a-006165a38414" x="0" y="41" width="185" height="20"/>
                    <textElement/>
                    <text><![CDATA[Name]]></text>
                </staticText>
                <staticText>
                    <reportElement uuid="bd0fc2f5-4963-4c9d-a9be-3659be06e436" x="185" y="41" width="185" height="20"/>
                    <textElement/>
                    <text><![CDATA[email]]></text>
                </staticText>
                <staticText>
                    <reportElement uuid="5d5d7ce1-5353-4f83-91b4-57725b0c922b" x="370" y="41" width="185" height="20"/>
                    <textElement/>
                    <text><![CDATA[amount]]></text>
                </staticText>
            </band>
        </groupHeader>
    </group>
    <detail>
        <band height="20">
            <textField>
                <reportElement uuid="5b325da6-7c56-4357-8808-911dad16ec53" x="0" y="0" width="185" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{Name}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement uuid="0bc06b28-7b8c-4af9-997a-714d1599def1" x="185" y="0" width="185" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{email}]]></textFieldExpression>
            </textField>
            <textField>
                <reportElement uuid="e5504bb9-c3c0-4135-94c6-7ea935f97cb6" x="370" y="0" width="185" height="20"/>
                <textElement/>
                <textFieldExpression><![CDATA[$F{amount}]]></textFieldExpression>
            </textField>
        </band>
    </detail>
</jasperReport>

【讨论】:

  • 提示顺序很有帮助,谢谢,我忘了!
  • 当你的字段已经是一个集合,你需要按集合 POJO 的一个字段分组时怎么办? JRBeanCollectionDataSource 中的 Collection&lt;User&gt; 之类的东西,例如,我需要按用户电子邮件进行分组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多