JasperReports dengan Spring

1. Ikhtisar

JasperReports adalah pustaka pelaporan sumber terbuka yang memungkinkan pengguna membuat laporan dengan piksel sempurna yang dapat dicetak atau diekspor dalam berbagai format termasuk PDF, HTML, dan XLS.

Dalam artikel ini, kita akan mempelajari fitur dan kelas utamanya, dan menerapkan contoh untuk menunjukkan kemampuannya.

2. Ketergantungan Maven

Pertama, kita perlu menambahkan dependensi jasperreports ke pom.xml kita :

 net.sf.jasperreports jasperreports 6.4.0 

Versi terbaru artefak ini dapat ditemukan di sini.

3. Template Laporan

Desain laporan ditentukan dalam file JRXML. Ini adalah file XML biasa dengan struktur tertentu yang dapat diinterpretasikan oleh mesin JasperReports.

Sekarang mari kita lihat hanya struktur yang relevan dari file JRXML - untuk lebih memahami bagian Java dari proses pembuatan laporan, yang merupakan fokus utama kami.

Mari buat laporan sederhana untuk menunjukkan informasi karyawan:

3.1. Menyusun Laporan

File JRXML perlu dikompilasi agar mesin laporan dapat mengisinya dengan data.

Mari kita lakukan operasi ini dengan bantuan kelas JasperCompilerManager :

InputStream employeeReportStream = getClass().getResourceAsStream("/employeeReport.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport(employeeReportStream);

Untuk menghindari kompilasi setiap saat, kita dapat menyimpannya ke file:

JRSaver.saveObject(jasperReport, "employeeReport.jasper");

4. Mengisi Laporan

Cara paling umum untuk mengisi laporan yang dikompilasi adalah dengan catatan dari database. Ini mengharuskan laporan berisi kueri SQL yang akan dijalankan mesin untuk mendapatkan data.

Pertama, mari ubah laporan kita untuk menambahkan kueri SQL:

    ... 

Sekarang, mari buat sumber data sederhana:

@Bean public DataSource dataSource() { return new EmbeddedDatabaseBuilder() .setType(EmbeddedDatabaseType.HSQL) .addScript("classpath:employee-schema.sql") .build(); }

Sekarang, kita bisa mengisi laporannya:

JasperPrint jasperPrint = JasperFillManager.fillReport( jasperReport, null, dataSource.getConnection());

Perhatikan bahwa kami meneruskan null ke argumen kedua karena laporan kami belum menerima parameter apa pun.

4.1. Parameter

Parameter berguna untuk meneruskan data ke mesin laporan yang tidak dapat ditemukan di sumber datanya atau saat data berubah bergantung pada kondisi waktu proses yang berbeda.

Kami juga dapat mengubah sebagian atau bahkan seluruh kueri SQL dengan parameter yang diterima dalam operasi pengisian laporan.

Pertama, mari ubah laporan untuk menerima tiga parameter:

       // ... 

Sekarang, mari tambahkan bagian judul untuk menampilkan parameter judul :

 // ...           ... 

Selanjutnya, mari kita ubah kueri untuk menggunakan minSalary dan parameter kondisi :

SELECT * FROM EMPLOYEE WHERE SALARY >= $P{minSalary} AND $P!{condition}

Perhatikan sintaks yang berbeda saat menggunakan parameter kondisi . Ini memberi tahu mesin bahwa parameter tidak boleh digunakan sebagai parameter PreparedStatement standar , tetapi seolah-olah nilai parameter tersebut akan ditulis aslinya dalam kueri SQL.

Terakhir, mari siapkan parameter dan isi laporannya:

Map parameters = new HashMap(); parameters.put("title", "Employee Report"); parameters.put("minSalary", 15000.0); parameters.put("condition", " LAST_NAME ='Smith' ORDER BY FIRST_NAME"); JasperPrint jasperPrint = JasperFillManager.fillReport(..., parameters, ...);

Perhatikan bahwa kunci parameter sesuai dengan nama parameter dalam laporan. Jika mesin mendeteksi ada parameter yang hilang, ia akan mendapatkan nilai dari defaultValueExpression dari parameter tersebut jika ada.

5. Mengekspor

Untuk mengekspor laporan, pertama, kita membuat instance objek dari kelas eksportir yang cocok dengan format file yang kita butuhkan.

Kemudian, kami menetapkan laporan terisi kami sebelumnya sebagai masukan dan menentukan di mana harus mengeluarkan file yang dihasilkan.

Secara opsional, kita dapat mengatur laporan yang sesuai dan mengekspor objek konfigurasi untuk menyesuaikan proses ekspor.

5.1. PDF

JRPdfExporter exporter = new JRPdfExporter(); exporter.setExporterInput(new SimpleExporterInput(jasperPrint)); exporter.setExporterOutput( new SimpleOutputStreamExporterOutput("employeeReport.pdf")); SimplePdfReportConfiguration reportConfig = new SimplePdfReportConfiguration(); reportConfig.setSizePageToContent(true); reportConfig.setForceLineBreakPolicy(false); SimplePdfExporterConfiguration exportConfig = new SimplePdfExporterConfiguration(); exportConfig.setMetadataAuthor("baeldung"); exportConfig.setEncrypted(true); exportConfig.setAllowedPermissionsHint("PRINTING"); exporter.setConfiguration(reportConfig); exporter.setConfiguration(exportConfig); exporter.exportReport();

5.2. XLS

JRXlsxExporter exporter = new JRXlsxExporter(); // Set input and output ... SimpleXlsxReportConfiguration reportConfig = new SimpleXlsxReportConfiguration(); reportConfig.setSheetNames(new String[] { "Employee Data" }); exporter.setConfiguration(reportConfig); exporter.exportReport();

5.3. CSV

JRCsvExporter exporter = new JRCsvExporter(); // Set input ... exporter.setExporterOutput( new SimpleWriterExporterOutput("employeeReport.csv")); exporter.exportReport();

5.4. HTML

HtmlExporter exporter = new HtmlExporter(); // Set input ... exporter.setExporterOutput( new SimpleHtmlExporterOutput("employeeReport.html")); exporter.exportReport();

6. Sublaporan

Sublaporan tidak lebih dari laporan standar yang disematkan dalam laporan lain.

Pertama, mari buat laporan untuk menampilkan email seorang karyawan:

Sekarang, mari ubah laporan karyawan kita untuk menyertakan yang sebelumnya:

Perhatikan bahwa kami mereferensikan sublaporan dengan nama file yang dikompilasi dan meneruskannya ke idEmployee dan koneksi laporan saat ini sebagai parameter.

Selanjutnya, mari kita menyusun kedua laporan tersebut:

InputStream employeeReportStream = getClass().getResourceAsStream("/employeeReport.jrxml"); JasperReport jasperReport = JasperCompileManager.compileReport(employeeReportStream); JRSaver.saveObject(jasperReport, "employeeReport.jasper"); InputStream emailReportStream = getClass().getResourceAsStream("/employeeEmailReport.jrxml"); JRSaver.saveObject( JasperCompileManager.compileReport(emailReportStream), "employeeEmailReport.jasper");

Kode kami untuk mengisi dan mengekspor laporan tidak memerlukan modifikasi.

7. Kesimpulan

Pada artikel ini, kami telah melihat sekilas fitur inti pustaka JasperReports.

Kami dapat mengumpulkan dan mengisi laporan dengan catatan dari database; kami meneruskan parameter untuk mengubah data yang ditampilkan dalam laporan sesuai dengan kondisi waktu proses yang berbeda, sublaporan tersemat, dan mengekspornya ke format yang paling umum.

Kode sumber lengkap untuk artikel ini dapat ditemukan di GitHub.