private void build() { TextColumnBuilder<String> countryColumn = col.column("Country", "country", type.stringType()); TextColumnBuilder<String> itemColumn = col.column("Item", "item", type.stringType()); TextColumnBuilder<Integer> quantityColumn = col.column("Quantity", "quantity", type.integerType()); TextColumnBuilder<BigDecimal> priceColumn = col.column("Price", "price", type.bigDecimalType()); ColumnGroupBuilder countryGroup = grp.group(countryColumn); VariableBuilder<Integer> quantitySum = variable(quantityColumn, Calculation.SUM); VariableBuilder<BigDecimal> priceSum = variable(priceColumn, Calculation.SUM); VariableBuilder<Integer> quantityGrpSum = variable(quantityColumn, Calculation.SUM); quantityGrpSum.setResetGroup(countryGroup); VariableBuilder<BigDecimal> priceGrpSum = variable(priceColumn, Calculation.SUM); priceGrpSum.setResetType(Evaluation.FIRST_GROUP); StyleBuilder subtotalStyle = stl.style().bold().setTopBorder(stl.pen1Point()).setHorizontalTextAlignment(HorizontalTextAlignment.CENTER); TextFieldBuilder<String> summarySbt = cmp.text(new CustomTextSubtotal(quantitySum, priceSum)).setStyle(subtotalStyle); TextFieldBuilder<String> groupSbt = cmp.text(new CustomTextSubtotal(quantityGrpSum, priceGrpSum)).setStyle(subtotalStyle); countryGroup.footer(groupSbt); try { report().setTemplate(Templates.reportTemplate) .variables(quantitySum, priceSum, quantityGrpSum, priceGrpSum) .columns(countryColumn, itemColumn, quantityColumn, priceColumn) .groupBy(countryGroup) .summary(summarySbt) .title(Templates.createTitleComponent("CustomTextSubtotal")) .pageFooter(Templates.footerComponent) .setDataSource(createDataSource()) .show(); } catch (DRException e) { e.printStackTrace(); } }