DynamicReports – riport generálás
Gyakran szükséges bizonyos adatokat vizualizáli az ügyfeleknek különféle szempontok alapján. Ebben lehet segítségünkre a DynamicReports , mely egy JasperReports alapú, könnyen használható, teljesen Javaból összeállítható riport szerkesztő könyvtár.
A példában egy fizetéseket tároló listát jelenítünk meg. A riport sorai a következő oszlopokat tartalmazzák:
@Getter
@Setter
@Builder
public class ReportRow {
private String name;
private Integer salary;
private String address;
private String job;
}
A riport összeállítása mindössze pár sor:
01 public class ReportGenerator {
02
03 public static void main(String[] args) {
04
05 try (OutputStream outputStream = new FileOutputStream("report.pdf")) {
06
07 StyleBuilder boldCentered = stl.style()
08 .bold()
09 .setHorizontalTextAlignment(HorizontalTextAlignment.CENTER);
10
11 StyleBuilder columnTitleStyle = stl.style(boldCentered)
12 .setBorder(stl.pen1Point())
13 .setBackgroundColor(Color.LIGHT_GRAY);
14
15 TextColumnBuilder<Integer> salaryColumnBuilder =
16 Columns.column("Salary", "salary", DataTypes.integerType());
17
18 TextColumnBuilder<String> nameColumnBuilder =
19 Columns.column("Name", "name", DataTypes.stringType());
20
21 Bar3DChartBuilder salaryChart = cht.bar3DChart()
22 .setTitle("Salary")
23 .setCategory(nameColumnBuilder)
24 .addSerie(cht.serie(salaryColumnBuilder));
25
26 report()
27 .setColumnTitleStyle(columnTitleStyle)
28 .highlightDetailEvenRows()
29 .title(cmp.text("Salary").setStyle(boldCentered))
30 .columns(
31 nameColumnBuilder,
32 Columns.column("Job", "job", DataTypes.stringType()),
33 Columns.column("Address", "address", DataTypes.stringType()),
34 salaryColumnBuilder
35 )
36 .subtotalsAtSummary(sbt.sum(salaryColumnBuilder))
37 .summary(salaryChart)
38 .setDataSource(reportData())
39 .toPdf(outputStream);
40
41 } catch (DRException | IOException e) {
42 throw new RuntimeException(e);
43 }
44
45 }
46
47 private static List<ReportRow> reportData() {
48 List<ReportRow> rows = new LinkedList<>();
49
50 rows.add(ReportRow.builder()
51 .address("Budapest")
52 .job("Developer")
53 .name("Gipsz Jakab")
54 .salary(2100)
55 .build());
56
57 [...]
58
59 return rows;
60 }
61 }
[7. - 13. sor]
Először létrehozunk két stílust, az első a címsor, a második az oszlopok fejlécének stílusa.
[15. - 19.]
Létrehozzuk a név és fizetés oszlopokat. Mivel a többi oszlopot csak egyszer használjuk, így azokat inline példányosítjuk.
[21. - 24.]
Egy oszlopdiagramot hozunk létre, melynek kategóriája a dolgozók neve, az értékkészlete pedig a dolgozók bére.
[26]
A DynamicReports osztály statikus report() metódusa visszaad egy JasperReportBuildert , melyet felhasználva paraméterezhetjük a riportot.
[27. - 29.]
Beállítjuk a stílusokat, címsort, valamint minden páros sort színezünk.
[30. - 35.]
Beállítjuk a kívánt oszlopokat. A fieldName paraméternek meg kell egyeznie a pojo osztályban lévő mezőnévvel.
[36]
A fizetést tartalmazó oszlopban szereplő értékeket az oszlop alatt összesítjük.
[37]
Beállítjuk a korábban létrehozott diagramot.
[38]
Átadjuk az adatokat, melyeket a reportData() függvényben állítunk össze.
[39]
A kimeneti streamre exportáljuk a riportot pdf formátumban.
Elkészült a riportunk:
A forrás elérhető GitHubon
A DynamicReports hivatalos oldala itt.