Laporan Jasper dengan Spring

1. Gambaran keseluruhan

JasperReports adalah pustaka pelaporan sumber terbuka yang membolehkan pengguna membuat laporan sempurna piksel yang dapat dicetak atau dieksport dalam banyak format termasuk PDF, HTML, dan XLS.

Dalam artikel ini, kami akan meneroka ciri dan kelas utamanya, dan menerapkan contoh untuk menunjukkan kemampuannya.

2. Ketergantungan Maven

Pertama, kita perlu menambahkan kebergantungan laporan jasper ke pom.xml kami :

 net.sf.jasperreports jasperreports 6.4.0 

Versi terbaru artifak ini boleh didapati di sini.

3. Templat Laporan

Reka bentuk laporan ditentukan dalam fail JRXML. Ini adalah fail XML biasa dengan struktur tertentu yang dapat ditafsirkan oleh mesin JasperReports.

Sekarang mari kita lihat hanya struktur fail JRXML yang relevan - untuk memahami bahagian Java dalam proses pembuatan laporan dengan lebih baik, yang menjadi fokus utama kami.

Mari buat laporan ringkas untuk menunjukkan maklumat pekerja:

3.1. Menyusun Laporan

Fail JRXML perlu disusun supaya mesin laporan dapat mengisinya dengan data.

Mari lakukan operasi ini dengan bantuan kelas JasperCompilerManager :

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

Untuk mengelakkan penyusunannya setiap kali, kita dapat menyimpannya ke fail:

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

4. Mengisi Laporan

Cara yang paling biasa untuk mengisi laporan yang disusun adalah dengan catatan dari pangkalan data. Ini memerlukan laporan berisi pertanyaan SQL yang akan dijalankan oleh mesin untuk mendapatkan data.

Pertama, mari ubah suai laporan kami untuk menambahkan pertanyaan SQL:

    ... 

Sekarang, mari buat sumber data mudah:

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

Sekarang, kita dapat mengisi laporan:

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

Perhatikan bahawa kita lulus null kepada hujah kedua sejak laporan kami tidak menerima apa-apa parameter lagi.

4.1. Parameter

Parameter berguna untuk menyampaikan data ke mesin laporan yang tidak dapat dijumpai di sumber datanya atau ketika data berubah bergantung pada keadaan waktu berjalan yang berbeza.

Kami juga dapat mengubah bahagian atau bahkan keseluruhan pertanyaan SQL dengan parameter yang diterima dalam operasi pengisian laporan.

Pertama, mari ubah suai laporan untuk menerima tiga parameter:

       // ... 

Sekarang, mari tambahkan bahagian tajuk untuk menunjukkan parameter tajuk :

 // ...           ... 

Seterusnya, mari kita ubah pertanyaan untuk menggunakan parameter minSalary dan condition :

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

Perhatikan sintaks yang berbeza semasa menggunakan parameter keadaan . Ini memberitahu mesin bahwa parameter tersebut tidak boleh digunakan sebagai parameter standar PreparedStatement , tetapi seolah-olah nilai parameter tersebut akan ditulis awalnya dalam pertanyaan SQL.

Akhirnya, mari sediakan parameter dan isi laporan:

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 bahawa kunci parameter sesuai dengan nama parameter dalam laporan. Sekiranya mesin mengesan parameter hilang, ia akan memperoleh nilai dari defaultValueExpression parameter jika ada.

5. Mengeksport

Untuk mengeksport laporan, pertama, kami menunjukkan objek kelas pengeksport yang sesuai dengan format fail yang kami perlukan.

Kemudian, kami menetapkan laporan yang diisi sebelumnya sebagai input dan menentukan tempat untuk mengeluarkan fail yang dihasilkan.

Sebagai pilihan, kami dapat menetapkan laporan konfigurasi dan objek konfigurasi eksport untuk menyesuaikan proses eksport.

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. Subreport

Subreport tidak lebih dari sekadar laporan standard yang disertakan dalam laporan lain.

Pertama, mari buat laporan untuk menunjukkan e-mel pekerja:

Sekarang, mari ubah suai laporan pekerja kami untuk menyertakan laporan sebelumnya:

Perhatikan bahawa kami merujuk sub laporan dengan nama file yang disusun dan meneruskannya sebagai idEm Employee dan sambungan laporan semasa sebagai parameter.

Seterusnya, mari kita susun kedua-dua laporan:

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");

Kod kami untuk mengisi dan mengeksport laporan tidak memerlukan pengubahsuaian.

7. Kesimpulannya

Dalam artikel ini, kami melihat sekilas mengenai inti ciri perpustakaan JasperReports.

Kami dapat menyusun dan mengisi laporan dengan catatan dari pangkalan data; kami melewati parameter untuk mengubah data yang ditunjukkan dalam laporan mengikut keadaan jangka masa yang berlainan, sub-laporan tertanam dan mengeksportnya ke format yang paling umum.

Kod sumber lengkap untuk artikel ini boleh didapati di GitHub.