PAYATHON 2026

如何在 Jaspersoft iReport Designer 中汇总列值?

支付阿杰

结论

$V{COLUMN_COUNT} 统计的是当前列中的记录数,不能用于汇总字段值。要计算 Doctor Payment 的总额,需要在 iReport 中创建一个 calculation="Sum" 的变量,对每条记录的付款字段进行累加,再将结果显示在 Summary 或 Report Footer 区域。

配置步骤

假设付款字段名为 doctorPayment,类型为 java.math.BigDecimal:

  1. 在 Report Inspector 中右键单击 Variables。

  2. 选择 Add Variable。

  3. 设置以下变量属性:

    • Variable Name:DoctorPaymentSum
    • Variable Class:java.math.BigDecimal
    • Calculation:Sum
    • Reset Type:Report
    • Variable Expression:
$F{doctorPayment}
  1. 在报表的 Summary 或 Report Footer 区域添加一个 Text Field。
  2. 将 Text Field Expression 设置为:
$V{DoctorPaymentSum}

查询无论返回 5 行还是更多行,JasperReports 都会在处理明细记录时逐条累加,最后得到整份报表的总金额。

对应的 JRXML 配置

<variable name="DoctorPaymentSum"
          class="java.math.BigDecimal"
          calculation="Sum"
          resetType="Report">
    <variableExpression><![CDATA[$F{doctorPayment}]]></variableExpression>
    <initialValueExpression><![CDATA[java.math.BigDecimal.ZERO]]></initialValueExpression>
</variable>

用于显示总计的 Text Field 可以这样配置:

<textField pattern="#,##0.00">
    <reportElement x="100" y="0" width="100" height="20"/>
    <textFieldExpression><![CDATA[$V{DoctorPaymentSum}]]></textFieldExpression>
</textField>

如果付款金额不需要小数,可以将格式改为:

<textField pattern="#,##0">

处理空值

如果数据库字段可能为 null,可以在变量表达式中将空值明确按零处理:

$F{doctorPayment} == null
    ? java.math.BigDecimal.ZERO
    : $F{doctorPayment}

完整配置如下:

<variable name="DoctorPaymentSum"
          class="java.math.BigDecimal"
          calculation="Sum"
          resetType="Report">
    <variableExpression><![CDATA[
        $F{doctorPayment} == null
            ? java.math.BigDecimal.ZERO
            : $F{doctorPayment}
    ]]></variableExpression>
    <initialValueExpression><![CDATA[java.math.BigDecimal.ZERO]]></initialValueExpression>
</variable>

数据类型注意事项

变量类型应与字段类型一致:

  • 字段是 java.math.BigDecimal:变量使用 java.math.BigDecimal
  • 字段是 java.lang.Integer:变量可以使用 java.lang.Integer
  • 字段是 java.lang.Long:变量可以使用 java.lang.Long
  • 字段是 java.lang.Double:变量可以使用 java.lang.Double

金额字段建议使用 java.math.BigDecimal,以免 Double 浮点运算产生精度误差。

如果字段目前是 Integer,但希望用 BigDecimal 计算总计,可以显式转换:

$F{doctorPayment} == null
    ? java.math.BigDecimal.ZERO
    : new java.math.BigDecimal($F{doctorPayment}.toString())

总计应该放在哪里

整份报表的最终总计通常放在以下区域:

  • Summary:在所有明细数据处理完成后显示,适合放置报表总计。
  • Report Footer:位于整份报表末尾,也可以显示总计。

如果将变量放在 Detail 中,显示的会是逐行增长的累计值。放在 Page Footer 中时,显示结果还会受分页和求值时间影响,因此不适合直接用于展示整份报表的最终总计。

对于示例数据,$V{DoctorPaymentSum} 最终返回:

123 + 223 + 234 + 678 + 343 = 1601

也可以直接在 SQL 查询中使用 SUM()。不过,如果报表既要展示每位医生的记录,又要在末尾显示总计,使用 JasperReports 的 Sum 变量通常更直接。

备注:内容仅供参考。