Last active
April 3, 2017 09:47
-
-
Save Enkuushka/acd95d7174858ab4d7e107310a2f59f5 to your computer and use it in GitHub Desktop.
DynamicReports Cross-tab row, column ordering by value field
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package enkh.mon.java.codes.testing | |
import java.util.ArrayList; | |
import java.util.List; | |
import net.sf.dynamicreports.examples.Templates; | |
import net.sf.dynamicreports.jasper.builder.JasperReportBuilder; | |
import net.sf.dynamicreports.report.base.expression.AbstractSimpleExpression; | |
import net.sf.dynamicreports.report.base.expression.AbstractValueFormatter; | |
import static net.sf.dynamicreports.report.builder.DynamicReports.asc; | |
import static net.sf.dynamicreports.report.builder.DynamicReports.cmp; | |
import static net.sf.dynamicreports.report.builder.DynamicReports.ctab; | |
import static net.sf.dynamicreports.report.builder.DynamicReports.desc; | |
import static net.sf.dynamicreports.report.builder.DynamicReports.field; | |
import static net.sf.dynamicreports.report.builder.DynamicReports.report; | |
import static net.sf.dynamicreports.report.builder.DynamicReports.stl; | |
import net.sf.dynamicreports.report.builder.SortBuilder; | |
import net.sf.dynamicreports.report.builder.component.Components; | |
import net.sf.dynamicreports.report.builder.crosstab.CrosstabBuilder; | |
import net.sf.dynamicreports.report.builder.crosstab.CrosstabColumnGroupBuilder; | |
import net.sf.dynamicreports.report.builder.crosstab.CrosstabMeasureBuilder; | |
import net.sf.dynamicreports.report.builder.crosstab.CrosstabRowGroupBuilder; | |
import net.sf.dynamicreports.report.builder.expression.AbstractComplexExpression; | |
import net.sf.dynamicreports.report.builder.style.StyleBuilder; | |
import net.sf.dynamicreports.report.constant.Calculation; | |
import net.sf.dynamicreports.report.constant.HorizontalTextAlignment; | |
import net.sf.dynamicreports.report.constant.OrderType; | |
import net.sf.dynamicreports.report.constant.PageOrientation; | |
import net.sf.dynamicreports.report.constant.PageType; | |
import net.sf.dynamicreports.report.constant.VerticalTextAlignment; | |
import net.sf.dynamicreports.report.definition.ReportParameters; | |
import net.sf.dynamicreports.report.exception.DRException; | |
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource; | |
/** | |
* | |
* @author Enkhbold Mainbayaryn | |
*/ | |
public class CrosstabGroupTest { | |
public JasperReportBuilder build() throws DRException { | |
JasperReportBuilder report = report(); | |
// styles | |
String reportFont = "Roboto"; | |
int cellPadding = 3; | |
StyleBuilder headerStyleCenter = stl.style().setFontName(reportFont).setFontSize(10).setBold(true) | |
.setBorder(stl.pen1Point()).setPadding(cellPadding) | |
.setHorizontalTextAlignment(HorizontalTextAlignment.CENTER) | |
.setVerticalTextAlignment(VerticalTextAlignment.MIDDLE); | |
StyleBuilder rowStyleData = stl.style().setFontName(reportFont).setFontSize(10) | |
.setBorder(stl.pen1Point()).setPadding(cellPadding) | |
.setHorizontalTextAlignment(HorizontalTextAlignment.CENTER) | |
.setVerticalTextAlignment(VerticalTextAlignment.MIDDLE); | |
// row groups | |
// CrosstabRowGroupBuilder<String> rowGroupItem = ctab.rowGroup("product", String.class).setShowTotal(false) | |
// .setHeaderStyle(rowStyleData).setHeaderWidth(120); | |
CrosstabRowGroupBuilder<String> rowGroupItem = ctab.rowGroup(new CTOrderExpression("rowOrder", "product")).setShowTotal(false).setHeaderStyle(rowStyleData).setHeaderWidth(120) | |
.setHeaderValueFormatter(new CTOValueFormatter()); | |
CrosstabRowGroupBuilder<String> rowGroupUnit = ctab.rowGroup("unit", String.class).setShowTotal(false) | |
.setHeaderStyle(rowStyleData).setHeaderWidth(50); | |
CrosstabRowGroupBuilder<String> rowGroupDate = ctab.rowGroup("date", String.class).setShowTotal(false) | |
.setHeaderStyle(rowStyleData).setHeaderWidth(50); | |
// column groups | |
CrosstabColumnGroupBuilder col_type = ctab.columnGroup(new CTOrderExpression("colOrder", "branch")).setTotalHeader("Total quantity") | |
.setShowTotal(true).setHeaderStyle(rowStyleData); | |
// measure | |
CrosstabMeasureBuilder quantityMeasure = ctab.measure("", "amount", Double.class, Calculation.NOTHING).setTitleStyle(stl.style().setFontSize(0)); | |
CrosstabBuilder crosstab = ctab.crosstab() | |
.setCellWidth(220) | |
.addHeaderCell(cmp.horizontalList( | |
cmp.text("Product").setStyle(headerStyleCenter).setFixedWidth(120), | |
cmp.text("Unit").setStyle(headerStyleCenter).setFixedWidth(50), | |
cmp.text("Year").setStyle(headerStyleCenter).setFixedWidth(50)) | |
) | |
.setCellStyle(rowStyleData).setCellWidth(60) | |
.rowGroups(rowGroupItem, rowGroupUnit, rowGroupDate) | |
.columnGroups(col_type) | |
// .setDataPreSorted(true) | |
.measures(quantityMeasure); | |
// data | |
List<ProductQuantityData> dataList = new ArrayList<>(); | |
int row_Order = 1; | |
int col_Order = 1; | |
dataList.add(new ProductQuantityData("Water", "litre", "2016.02", "Branch 1", 50d, row_Order, col_Order)); | |
dataList.add(new ProductQuantityData("Water", "litre", "2017.02", "Branch 1", 150d, row_Order, col_Order)); | |
dataList.add(new ProductQuantityData("Water", "litre", "diff", "Branch 1", 100d, row_Order, col_Order)); | |
col_Order = 2; | |
dataList.add(new ProductQuantityData("Water", "litre", "2016.02", "Branch 2", 150d, row_Order, col_Order)); | |
dataList.add(new ProductQuantityData("Water", "litre", "2017.02", "Branch 2", 140d, row_Order, col_Order)); | |
dataList.add(new ProductQuantityData("Water", "litre", "diff", "Branch 2", -10d, row_Order, col_Order)); | |
row_Order = 2; | |
col_Order = 1; | |
dataList.add(new ProductQuantityData("Coffee bean", "kg", "2016.02", "Branch 1", 80d, row_Order, col_Order)); | |
dataList.add(new ProductQuantityData("Coffee bean", "kg", "2017.02", "Branch 1", 75d, row_Order, col_Order)); | |
dataList.add(new ProductQuantityData("Coffee bean", "kg", "diff", "Branch 1", -5d, row_Order, col_Order)); | |
col_Order = 2; | |
dataList.add(new ProductQuantityData("Coffee bean", "kg", "2016.02", "Branch 2", 77d, row_Order, col_Order)); | |
dataList.add(new ProductQuantityData("Coffee bean", "kg", "2017.02", "Branch 2", 77d, row_Order, col_Order)); | |
dataList.add(new ProductQuantityData("Coffee bean", "kg", "diff", "Branch 2", 0d, row_Order, col_Order)); | |
// sort | |
SortBuilder rowSortBuilder = asc(field("rowOrder", Integer.class)); | |
SortBuilder columnSortBuilder = asc(field("colOrder", Integer.class)); | |
report | |
// .sortBy(rowSortBuilder, columnSortBuilder) | |
// .sortBy(rowSortBuilder, columnSortBuilder) | |
.setPageFormat(PageType.A4, PageOrientation.LANDSCAPE) | |
.setTemplate(Templates.reportTemplate) | |
.title(Components.text("Product quantity by branch")) | |
.summary(crosstab) | |
.pageFooter(Components.pageXslashY()) | |
.setDataSource(new JRBeanCollectionDataSource(dataList)); | |
return report; | |
} | |
public static void main(String[] args) { | |
CrosstabGroupTest design = new CrosstabGroupTest(); | |
try { | |
JasperReportBuilder report = design.build(); | |
report.show(); | |
} catch (DRException e) { | |
e.printStackTrace(); | |
} | |
} | |
public class CTOValueFormatter extends AbstractValueFormatter<String, String>{ | |
@Override | |
public String format(String value, ReportParameters reportParameters) { | |
return value.split("-")[1]; | |
} | |
} | |
public class CTOrderExpression extends AbstractComplexExpression<String> { | |
public CTOrderExpression(String sortField, String showField) { | |
addExpression(field(sortField, Integer.class)); | |
addExpression(field(showField, String.class)); | |
} | |
@Override | |
public String evaluate(List<?> list, ReportParameters rp) { | |
return list.get(0) + "-" + list.get(1); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment