Skip to content

Commit c2c656b

Browse files
authored
Merge pull request jamilxt#2 from faisal1104/master
add: dynamic JasperReportApi
2 parents 6a2a13c + 296ac9c commit c2c656b

File tree

21 files changed

+918
-16
lines changed

21 files changed

+918
-16
lines changed

src/main/java/com/jamilxt/java_springboot_japserreport/controller/report/ReportApi.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package com.jamilxt.java_springboot_japserreport.controller.report;
22

3-
import com.jamilxt.java_springboot_japserreport.model.report.ExportType;
3+
import com.jamilxt.java_springboot_japserreport.domain.report.ExportType;
44
import net.sf.jasperreports.engine.JRException;
55
import org.springframework.http.ResponseEntity;
66
import org.springframework.web.bind.annotation.GetMapping;
@@ -16,4 +16,9 @@ public interface ReportApi {
1616
@GetMapping(value = "transactions/download")
1717
ResponseEntity<Void> downloadTransactionReport(@RequestParam(value = "exportType") ExportType exportType,
1818
HttpServletResponse response) throws IOException, JRException;
19+
20+
// new endpoint to generate & EXPORT dynamic report
21+
@GetMapping(value = "dynamic/transactions/download")
22+
ResponseEntity<Void> exportDynamicTransactionReport(@RequestParam(value = "exportType") ExportType exportType,
23+
HttpServletResponse response) throws IOException, JRException;
1924
}

src/main/java/com/jamilxt/java_springboot_japserreport/controller/report/ReportController.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
package com.jamilxt.java_springboot_japserreport.controller.report;
22

3-
import com.jamilxt.java_springboot_japserreport.model.report.ExportType;
3+
import com.jamilxt.java_springboot_japserreport.domain.report.ExportType;
44
import com.jamilxt.java_springboot_japserreport.service.report.ReportService;
5+
import com.jamilxt.java_springboot_japserreport.service.transaction.TransactionService;
56
import net.sf.jasperreports.engine.JRException;
67
import org.springframework.http.ResponseEntity;
78
import org.springframework.web.bind.annotation.RestController;
@@ -14,9 +15,11 @@
1415
public class ReportController implements ReportApi {
1516

1617
private final ReportService reportService;
18+
private final TransactionService transactionService;
1719

18-
public ReportController(ReportService reportService) {
20+
public ReportController(ReportService reportService, TransactionService transactionService) {
1921
this.reportService = reportService;
22+
this.transactionService = transactionService;
2023
}
2124

2225
@Override
@@ -25,4 +28,10 @@ public ResponseEntity<Void> downloadTransactionReport(ExportType exportType,
2528
reportService.downloadTransactionReport(exportType, response);
2629
return ResponseEntity.ok().build();
2730
}
31+
32+
@Override
33+
public ResponseEntity<Void> exportDynamicTransactionReport(ExportType exportType, HttpServletResponse response) throws IOException, JRException {
34+
transactionService.exportTransactionReport(exportType, response);
35+
return ResponseEntity.ok().build();
36+
}
2837
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.jamilxt.java_springboot_japserreport.domain;
2+
3+
import com.jamilxt.java_springboot_japserreport.domain.report.ExportType;
4+
import com.jamilxt.java_springboot_japserreport.domain.report.dynamic.DynamicReportProperties;
5+
import com.jamilxt.java_springboot_japserreport.model.transaction.Transaction;
6+
import java.io.InputStream;
7+
import java.text.DecimalFormat;
8+
import java.util.ArrayList;
9+
import java.util.List;
10+
11+
import static com.jamilxt.java_springboot_japserreport.util.Constant.*;
12+
13+
public class TransactionFilter {
14+
ExportType exportType;
15+
16+
public TransactionFilter(ExportType exportType) {
17+
this.exportType = exportType;
18+
}
19+
20+
public InputStream getInputStream() {
21+
var name = FOLDER_PATH_REPORT_DYNAMIC + this.exportType.toString().toLowerCase() + EXTENSION_JRXML;
22+
return getClass().getResourceAsStream(name);
23+
}
24+
25+
public String getReportTitle() {
26+
return "Transaction Summary Report";
27+
}
28+
29+
public DynamicReportProperties generateDynamicColumnAndRows(List<Transaction> list) {
30+
var totalVolume = Double.valueOf(0.00);
31+
var totalAmount = Double.valueOf(0.00);
32+
DecimalFormat df = new DecimalFormat("#,###.###");
33+
34+
List<String> columnHeaders = new ArrayList<>();
35+
List<Integer> indexesOfColumnTypeNumber = new ArrayList<>();
36+
List<List<String>> rows = new ArrayList<>();
37+
List<String> summary = new ArrayList<>();
38+
39+
// dynamic
40+
41+
// static
42+
columnHeaders.add("Date");
43+
columnHeaders.add("Time");
44+
columnHeaders.add("Site");
45+
columnHeaders.add("Fleet");
46+
columnHeaders.add("Vehicle");
47+
columnHeaders.add("Driver");
48+
columnHeaders.add("Auth Code");
49+
columnHeaders.add("Tax Payer Id");
50+
columnHeaders.add("Trn Number");
51+
columnHeaders.add("Sub Account");
52+
columnHeaders.add("Identification");
53+
columnHeaders.add("Fuel");
54+
columnHeaders.add("Volume\n(LTR)");
55+
columnHeaders.add("Amount\n(TK)");
56+
columnHeaders.add("Unit Price\n(TK)");
57+
58+
for (var s : list) {
59+
List<String> row = new ArrayList<>();
60+
row.add(s.getDate());
61+
row.add(s.getTime());
62+
row.add(s.getSite());
63+
row.add(s.getFleet());
64+
row.add(s.getVehicle());
65+
row.add(s.getDriver());
66+
row.add(s.getAuthCode());
67+
row.add(s.getTaxPayerId());
68+
row.add(s.getTrnNumber());
69+
row.add(s.getSubAccount());
70+
row.add(s.getIdentification());
71+
row.add(s.getFuel());
72+
row.add(String.valueOf(s.getVolume()));
73+
row.add(String.valueOf(s.getAmount()));
74+
row.add(String.valueOf(s.getUnitPrice()));
75+
76+
rows.add(row);
77+
78+
// sum
79+
totalVolume+=s.getVolume();
80+
totalAmount+=s.getAmount();
81+
}
82+
83+
// summary
84+
summary.add("Total");
85+
summary.add(df.format(totalVolume).toString());
86+
summary.add(df.format(totalAmount).toString());
87+
summary.add(null);
88+
89+
// number field index list
90+
indexesOfColumnTypeNumber.add(columnHeaders.size() - 4); // "Total"
91+
indexesOfColumnTypeNumber.add(columnHeaders.size() - 3); // totalVolume
92+
indexesOfColumnTypeNumber.add(columnHeaders.size() - 2); // totalAmount
93+
indexesOfColumnTypeNumber.add(columnHeaders.size() - 1); // totalAmount
94+
95+
return new DynamicReportProperties(columnHeaders, indexesOfColumnTypeNumber, rows, summary);
96+
}
97+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.jamilxt.java_springboot_japserreport.domain.report;
2+
3+
public enum ExportType {
4+
PDF("pdf", "application/pdf"),
5+
EXCEL("xlsx", "application/octet-stream"),
6+
CSV("csv", "text/csv"),
7+
DOCX("docx", "application/octet-stream");
8+
9+
private final String extension;
10+
private final String contentType;
11+
12+
ExportType(String extension, String contentType) {
13+
this.extension = extension;
14+
this.contentType = contentType;
15+
}
16+
17+
public String getExtension() {
18+
return "." + extension;
19+
}
20+
21+
public String getContentType() {
22+
return contentType;
23+
}
24+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
package com.jamilxt.java_springboot_japserreport.domain.report;
2+
3+
import net.sf.jasperreports.engine.JRException;
4+
import net.sf.jasperreports.engine.JasperPrint;
5+
import net.sf.jasperreports.engine.export.JRCsvExporter;
6+
import net.sf.jasperreports.engine.export.JRPdfExporter;
7+
import net.sf.jasperreports.engine.export.ooxml.JRDocxExporter;
8+
import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
9+
import net.sf.jasperreports.export.SimpleExporterInput;
10+
import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
11+
import net.sf.jasperreports.export.SimpleWriterExporterOutput;
12+
import net.sf.jasperreports.export.SimpleXlsxReportConfiguration;
13+
import org.springframework.http.HttpHeaders;
14+
import javax.servlet.http.HttpServletResponse;
15+
import java.io.IOException;
16+
import java.io.InputStream;
17+
import java.io.UnsupportedEncodingException;
18+
import java.net.URLEncoder;
19+
import java.time.LocalDateTime;
20+
import java.time.format.DateTimeFormatter;
21+
import java.util.Collection;
22+
23+
import static com.jamilxt.java_springboot_japserreport.domain.report.ExportType.*;
24+
25+
public class Report {
26+
public static final String ATTACHMENT_FILENAME = "attachment;filename=";
27+
InputStream inputStream;
28+
String title;
29+
Collection<?> beanCollection;
30+
ExportType exportType;
31+
HttpServletResponse response;
32+
33+
public Report(
34+
InputStream inputStream,
35+
String title,
36+
Collection<?> beanCollection,
37+
ExportType exportType,
38+
HttpServletResponse response) {
39+
this.inputStream = inputStream;
40+
this.title = title;
41+
this.beanCollection = beanCollection;
42+
this.exportType = exportType;
43+
this.response = response;
44+
}
45+
46+
public InputStream getInputStream() {
47+
return inputStream;
48+
}
49+
50+
public String getTitle() {
51+
return title;
52+
}
53+
54+
public Collection<?> getBeanCollection() {
55+
return beanCollection;
56+
}
57+
58+
public ExportType getExportType() {
59+
return exportType;
60+
}
61+
62+
public void exportViaJasperReport(JasperPrint jasperPrint) throws JRException, IOException {
63+
if (exportType == PDF) {
64+
JRPdfExporter exporter = new JRPdfExporter();
65+
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
66+
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));
67+
setHeaderAndContentType(response, exportType);
68+
exporter.exportReport();
69+
} else if (exportType == EXCEL) {
70+
JRXlsxExporter exporter = new JRXlsxExporter();
71+
SimpleXlsxReportConfiguration reportConfigXLS = new SimpleXlsxReportConfiguration();
72+
reportConfigXLS.setSheetNames(new String[] {title});
73+
reportConfigXLS.setDetectCellType(true);
74+
reportConfigXLS.setCollapseRowSpan(false);
75+
reportConfigXLS.setRemoveEmptySpaceBetweenRows(true);
76+
reportConfigXLS.setRemoveEmptySpaceBetweenColumns(true);
77+
exporter.setConfiguration(reportConfigXLS);
78+
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
79+
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));
80+
setHeaderAndContentType(response, exportType);
81+
exporter.exportReport();
82+
} else if (exportType == CSV) {
83+
JRCsvExporter exporter = new JRCsvExporter();
84+
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
85+
var outputStream = response.getOutputStream();
86+
exporter.setExporterOutput((new SimpleWriterExporterOutput(outputStream)));
87+
setHeaderAndContentType(response, exportType);
88+
exporter.exportReport();
89+
} else if (exportType == DOCX) {
90+
JRDocxExporter exporter = new JRDocxExporter();
91+
exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
92+
exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(response.getOutputStream()));
93+
setHeaderAndContentType(response, exportType);
94+
exporter.exportReport();
95+
} else {
96+
throw new RuntimeException("File Format isn't supported!");
97+
}
98+
}
99+
100+
private void setHeaderAndContentType(HttpServletResponse response, ExportType exportType)
101+
throws UnsupportedEncodingException {
102+
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, getHeaderValue(exportType));
103+
response.setContentType(exportType.getContentType());
104+
}
105+
106+
private String getHeaderValue(ExportType exportType) throws UnsupportedEncodingException {
107+
var formatter = DateTimeFormatter.ofPattern("yyyyMMddHHmmss");
108+
var dateTimeNow = LocalDateTime.now().format(formatter);
109+
var fileName =
110+
URLEncoder.encode(title.replaceAll("[^\\w-]+", "_") + "_" + dateTimeNow, "UTF-8");
111+
return ATTACHMENT_FILENAME + fileName + exportType.getExtension() + ";";
112+
}
113+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.jamilxt.java_springboot_japserreport.domain.report.dynamic;
2+
3+
import com.jamilxt.java_springboot_japserreport.domain.report.ExportType;
4+
import com.jamilxt.java_springboot_japserreport.domain.report.Report;
5+
import javax.servlet.http.HttpServletResponse;
6+
import java.io.InputStream;
7+
8+
public class DynamicReport extends Report {
9+
private final DynamicReportProperties dynamicReportProperties;
10+
11+
public DynamicReport(
12+
InputStream inputStream,
13+
String title,
14+
ExportType exportType,
15+
HttpServletResponse response,
16+
DynamicReportProperties dynamicReportProperties) {
17+
super(inputStream, title, null, exportType, response);
18+
this.dynamicReportProperties = dynamicReportProperties;
19+
}
20+
21+
public DynamicReportProperties getDynamicReportProperties() {
22+
return dynamicReportProperties;
23+
}
24+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package com.jamilxt.java_springboot_japserreport.domain.report.dynamic;
2+
3+
import java.util.List;
4+
5+
public class DynamicReportProperties {
6+
List<String> columnHeaders;
7+
List<Integer> indexesOfColumnTypeNumber;
8+
List<List<String>> rows;
9+
List<String> summary;
10+
11+
public DynamicReportProperties() {
12+
}
13+
14+
public DynamicReportProperties(List<String> columnHeaders, List<Integer> indexesOfColumnTypeNumber, List<List<String>> rows, List<String> summary) {
15+
this.columnHeaders = columnHeaders;
16+
this.indexesOfColumnTypeNumber = indexesOfColumnTypeNumber;
17+
this.rows = rows;
18+
this.summary = summary;
19+
}
20+
21+
public List<String> getColumnHeaders() {
22+
return columnHeaders;
23+
}
24+
25+
public List<Integer> getIndexesOfColumnTypeNumber() {
26+
return indexesOfColumnTypeNumber;
27+
}
28+
29+
public List<List<String>> getRows() {
30+
return rows;
31+
}
32+
33+
public List<String> getSummary() {
34+
return summary;
35+
}
36+
}

src/main/java/com/jamilxt/java_springboot_japserreport/model/report/ExportType.java

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/main/java/com/jamilxt/java_springboot_japserreport/service/report/ReportService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
package com.jamilxt.java_springboot_japserreport.service.report;
22

3+
import com.jamilxt.java_springboot_japserreport.domain.report.ExportType;
34
import com.jamilxt.java_springboot_japserreport.model.transaction.Transaction;
4-
import com.jamilxt.java_springboot_japserreport.model.report.ExportType;
55
import com.jamilxt.java_springboot_japserreport.service.transaction.TransactionService;
66
import net.sf.jasperreports.engine.*;
77
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

0 commit comments

Comments
 (0)