diff --git a/spring-all/pom.xml b/spring-all/pom.xml
index a3a51425e2..eb7a573c89 100644
--- a/spring-all/pom.xml
+++ b/spring-all/pom.xml
@@ -106,6 +106,12 @@
guava
${guava.version}
+
+
+ net.sf.jasperreports
+ jasperreports
+ ${jasperreports.version}
+
@@ -296,6 +302,7 @@
3.1.3
3.4
3.6.1
+ 6.4.0
diff --git a/spring-all/src/main/java/org/baeldung/jasperreports/Main.java b/spring-all/src/main/java/org/baeldung/jasperreports/Main.java
new file mode 100644
index 0000000000..79aee100a6
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/jasperreports/Main.java
@@ -0,0 +1,39 @@
+package org.baeldung.jasperreports;
+
+import java.util.HashMap;
+import java.util.Map;
+import org.baeldung.jasperreports.config.JasperRerportsSimpleConfig;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+
+public class Main {
+ public static void main(String[] args) {
+
+ AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
+ ctx.register(JasperRerportsSimpleConfig.class);
+ ctx.refresh();
+
+ SimpleReportFiller simpleReportFiller = ctx.getBean(SimpleReportFiller.class);
+ simpleReportFiller.setReportFileName("employeeEmailReport.jrxml");
+ simpleReportFiller.compileReport();
+
+ simpleReportFiller.setReportFileName("employeeReport.jrxml");
+ simpleReportFiller.compileReport();
+
+ Map parameters = new HashMap<>();
+ parameters.put("title", "Employee Report Example");
+ parameters.put("minSalary", 15000.0);
+ parameters.put("condition", " LAST_NAME ='Smith' ORDER BY FIRST_NAME");
+
+ simpleReportFiller.setParameters(parameters);
+ simpleReportFiller.fillReport();
+
+ SimpleReportExporter simpleExporter = ctx.getBean(SimpleReportExporter.class);
+ simpleExporter.setJasperPrint(simpleReportFiller.getJasperPrint());
+
+ simpleExporter.exportToPdf("employeeReport.pdf", "baeldung");
+ simpleExporter.exportToXlsx("employeeReport.xlsx", "Employee Data");
+ simpleExporter.exportToCsv("employeeReport.csv");
+ simpleExporter.exportToHtml("employeeReport.html");
+
+ }
+}
diff --git a/spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportExporter.java b/spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportExporter.java
new file mode 100644
index 0000000000..1252dcda4d
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportExporter.java
@@ -0,0 +1,115 @@
+package org.baeldung.jasperreports;
+
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import net.sf.jasperreports.engine.JRException;
+import net.sf.jasperreports.engine.JasperPrint;
+import net.sf.jasperreports.engine.export.HtmlExporter;
+import net.sf.jasperreports.engine.export.JRCsvExporter;
+import net.sf.jasperreports.engine.export.JRPdfExporter;
+import net.sf.jasperreports.engine.export.ooxml.JRXlsxExporter;
+import net.sf.jasperreports.export.SimpleExporterInput;
+import net.sf.jasperreports.export.SimpleHtmlExporterOutput;
+import net.sf.jasperreports.export.SimpleOutputStreamExporterOutput;
+import net.sf.jasperreports.export.SimplePdfExporterConfiguration;
+import net.sf.jasperreports.export.SimplePdfReportConfiguration;
+import net.sf.jasperreports.export.SimpleWriterExporterOutput;
+import net.sf.jasperreports.export.SimpleXlsxReportConfiguration;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SimpleReportExporter {
+
+ private JasperPrint jasperPrint;
+
+ public SimpleReportExporter() {
+ }
+
+ public SimpleReportExporter (JasperPrint jasperPrint){
+ this.jasperPrint = jasperPrint;
+ }
+
+ public JasperPrint getJasperPrint() {
+ return jasperPrint;
+ }
+
+ public void setJasperPrint(JasperPrint jasperPrint) {
+ this.jasperPrint = jasperPrint;
+ }
+
+
+
+ public void exportToPdf(String fileName, String author) {
+
+ // print report to file
+ JRPdfExporter exporter = new JRPdfExporter();
+
+ exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
+ exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(fileName));
+
+ SimplePdfReportConfiguration reportConfig = new SimplePdfReportConfiguration();
+ reportConfig.setSizePageToContent(true);
+ reportConfig.setForceLineBreakPolicy(false);
+
+ SimplePdfExporterConfiguration exportConfig = new SimplePdfExporterConfiguration();
+ exportConfig.setMetadataAuthor(author);
+ exportConfig.setEncrypted(true);
+ exportConfig.setAllowedPermissionsHint("PRINTING");
+
+ exporter.setConfiguration(reportConfig);
+ exporter.setConfiguration(exportConfig);
+ try {
+ exporter.exportReport();
+ } catch (JRException ex) {
+ Logger.getLogger(SimpleReportFiller.class.getName())
+ .log(Level.SEVERE, null, ex);
+ }
+ }
+
+ public void exportToXlsx(String fileName,String sheetName) {
+ JRXlsxExporter exporter = new JRXlsxExporter();
+
+ exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
+ exporter.setExporterOutput(new SimpleOutputStreamExporterOutput(fileName));
+
+ SimpleXlsxReportConfiguration reportConfig = new SimpleXlsxReportConfiguration();
+ reportConfig.setSheetNames(new String[]{sheetName});
+
+ exporter.setConfiguration(reportConfig);
+
+ try {
+ exporter.exportReport();
+ } catch (JRException ex) {
+ Logger.getLogger(SimpleReportFiller.class.getName())
+ .log(Level.SEVERE, null, ex);
+ }
+ }
+
+ public void exportToCsv(String fileName) {
+ JRCsvExporter exporter = new JRCsvExporter();
+
+ exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
+ exporter.setExporterOutput(new SimpleWriterExporterOutput(fileName));
+
+ try {
+ exporter.exportReport();
+ } catch (JRException ex) {
+ Logger.getLogger(SimpleReportFiller.class.getName())
+ .log(Level.SEVERE, null, ex);
+ }
+ }
+
+ public void exportToHtml(String fileName) {
+ HtmlExporter exporter = new HtmlExporter();
+
+ exporter.setExporterInput(new SimpleExporterInput(jasperPrint));
+ exporter.setExporterOutput(new SimpleHtmlExporterOutput(fileName));
+
+ try {
+ exporter.exportReport();
+ } catch (JRException ex) {
+ Logger.getLogger(SimpleReportFiller.class.getName())
+ .log(Level.SEVERE, null, ex);
+ }
+ }
+}
diff --git a/spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportFiller.java b/spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportFiller.java
new file mode 100644
index 0000000000..ae675dd280
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/jasperreports/SimpleReportFiller.java
@@ -0,0 +1,90 @@
+package org.baeldung.jasperreports;
+
+import java.io.InputStream;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import javax.sql.DataSource;
+import net.sf.jasperreports.engine.JRException;
+import net.sf.jasperreports.engine.JasperCompileManager;
+import net.sf.jasperreports.engine.JasperFillManager;
+import net.sf.jasperreports.engine.JasperPrint;
+import net.sf.jasperreports.engine.JasperReport;
+import net.sf.jasperreports.engine.util.JRSaver;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class SimpleReportFiller {
+
+ private String reportFileName;
+
+ private JasperReport jasperReport;
+
+ private JasperPrint jasperPrint;
+
+ @Autowired
+ private DataSource dataSource;
+
+ private Map parameters;
+
+ public SimpleReportFiller() {
+ parameters = new HashMap<>();
+ }
+
+ public void prepareReport() {
+ compileReport();
+ fillReport();
+ }
+
+ public void compileReport() {
+ try {
+ InputStream reportStream = getClass().getResourceAsStream("/".concat(reportFileName));
+ jasperReport = JasperCompileManager.compileReport(reportStream);
+ JRSaver.saveObject(jasperReport, reportFileName.replace(".jrxml", ".jasper"));
+ } catch (JRException ex) {
+ Logger.getLogger(SimpleReportFiller.class.getName())
+ .log(Level.SEVERE, null, ex);
+ }
+ }
+
+ public void fillReport() {
+ try {
+ jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource.getConnection());
+ } catch (JRException | SQLException ex) {
+ Logger.getLogger(SimpleReportFiller.class.getName())
+ .log(Level.SEVERE, null, ex);
+ }
+ }
+
+ public DataSource getDataSource() {
+ return dataSource;
+ }
+
+ public void setDataSource(DataSource dataSource) {
+ this.dataSource = dataSource;
+ }
+
+ public Map getParameters() {
+ return parameters;
+ }
+
+ public void setParameters(Map parameters) {
+ this.parameters = parameters;
+ }
+
+ public String getReportFileName() {
+ return reportFileName;
+ }
+
+ public void setReportFileName(String reportFileName) {
+ this.reportFileName = reportFileName;
+ }
+
+ public JasperPrint getJasperPrint() {
+ return jasperPrint;
+ }
+
+}
diff --git a/spring-all/src/main/java/org/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java b/spring-all/src/main/java/org/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java
new file mode 100644
index 0000000000..90fc96cdbb
--- /dev/null
+++ b/spring-all/src/main/java/org/baeldung/jasperreports/config/JasperRerportsSimpleConfig.java
@@ -0,0 +1,32 @@
+package org.baeldung.jasperreports.config;
+
+import javax.sql.DataSource;
+import org.baeldung.jasperreports.SimpleReportExporter;
+import org.baeldung.jasperreports.SimpleReportFiller;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
+import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
+
+@Configuration
+public class JasperRerportsSimpleConfig {
+
+ @Bean
+ public DataSource dataSource() {
+ return new EmbeddedDatabaseBuilder()
+ .setType(EmbeddedDatabaseType.HSQL)
+ .addScript("classpath:employee-schema.sql")
+ .build();
+ }
+
+ @Bean
+ public SimpleReportFiller reportFiller() {
+ return new SimpleReportFiller();
+ }
+
+ @Bean
+ public SimpleReportExporter reportExporter() {
+ return new SimpleReportExporter();
+ }
+
+}
diff --git a/spring-all/src/main/resources/employee-schema.sql b/spring-all/src/main/resources/employee-schema.sql
new file mode 100644
index 0000000000..011ff162e1
--- /dev/null
+++ b/spring-all/src/main/resources/employee-schema.sql
@@ -0,0 +1,27 @@
+CREATE TABLE EMPLOYEE(
+ ID INT NOT NULL PRIMARY KEY,
+ FIRST_NAME VARCHAR(255),
+ LAST_NAME VARCHAR(255),
+ SALARY DOUBLE,
+);
+
+CREATE TABLE EMAIL(
+ ID INT NOT NULL PRIMARY KEY,
+ ID_EMPLOYEE VARCHAR(255),
+ ADDRESS VARCHAR(255)
+);
+
+INSERT INTO EMPLOYEE VALUES (1, 'John', 'Doe', 10000.10);
+INSERT INTO EMPLOYEE VALUES (2, 'Kevin', 'Smith', 20000.20);
+INSERT INTO EMPLOYEE VALUES (3, 'Kim', 'Smith', 30000.30);
+INSERT INTO EMPLOYEE VALUES (4, 'Stephen', 'Torvalds', 40000.40);
+INSERT INTO EMPLOYEE VALUES (5, 'Christian', 'Reynolds', 50000.50);
+
+INSERT INTO EMAIL VALUES (1, 1, 'john@baeldung.com');
+INSERT INTO EMAIL VALUES (2, 1, 'john@gmail.com');
+INSERT INTO EMAIL VALUES (3, 2, 'kevin@baeldung.com');
+INSERT INTO EMAIL VALUES (4, 3, 'kim@baeldung.com');
+INSERT INTO EMAIL VALUES (5, 3, 'kim@gmail.com');
+INSERT INTO EMAIL VALUES (6, 3, 'kim@outlook.com');
+INSERT INTO EMAIL VALUES (7, 4, 'stephen@baeldung.com');
+INSERT INTO EMAIL VALUES (8, 5, 'christian@gmail.com');
diff --git a/spring-all/src/main/resources/employeeEmailReport.jrxml b/spring-all/src/main/resources/employeeEmailReport.jrxml
new file mode 100644
index 0000000000..ad4aaaac90
--- /dev/null
+++ b/spring-all/src/main/resources/employeeEmailReport.jrxml
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/spring-all/src/main/resources/employeeReport.jrxml b/spring-all/src/main/resources/employeeReport.jrxml
new file mode 100644
index 0000000000..3d2be226fb
--- /dev/null
+++ b/spring-all/src/main/resources/employeeReport.jrxml
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+ = $P{minSalary} AND $P!{condition}]]>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+