JasperReports với Spring

1. Khái quát chung

JasperReports là một thư viện báo cáo mã nguồn mở cho phép người dùng tạo các báo cáo pixel hoàn hảo có thể được in hoặc xuất ở nhiều định dạng bao gồm PDF, HTML và XLS.

Trong bài viết này, chúng ta sẽ khám phá các tính năng và lớp chính của nó, đồng thời triển khai các ví dụ để giới thiệu các khả năng của nó.

2. Sự phụ thuộc của Maven

Đầu tiên, chúng ta cần thêm phụ thuộc jasperreports vào pom.xml :

 net.sf.jasperreports jasperreports 6.4.0 

Phiên bản mới nhất của hiện vật này có thể được tìm thấy ở đây.

3. Mẫu Báo cáo

Các thiết kế báo cáo được xác định trong các tệp JRXML. Đây là các tệp XML thông thường có cấu trúc cụ thể mà công cụ JasperReports có thể diễn giải.

Bây giờ chúng ta hãy chỉ xem xét cấu trúc liên quan của các tệp JRXML - để hiểu rõ hơn về phần Java của quá trình tạo báo cáo, đó là trọng tâm chính của chúng tôi.

Hãy tạo một báo cáo đơn giản để hiển thị thông tin nhân viên:

3.1. Biên soạn báo cáo

Các tệp JRXML cần được biên dịch để công cụ báo cáo có thể điền vào chúng bằng dữ liệu.

Hãy thực hiện thao tác này với sự trợ giúp của lớp JasperCompilerManager :

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

Để tránh biên dịch nó mỗi lần, chúng tôi có thể lưu nó vào một tệp:

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

4. Báo cáo phổ biến

Cách phổ biến nhất để điền vào các báo cáo đã biên dịch là sử dụng các bản ghi từ cơ sở dữ liệu. Điều này yêu cầu báo cáo phải chứa một truy vấn SQL mà công cụ sẽ thực thi để lấy dữ liệu.

Trước tiên, hãy sửa đổi báo cáo của chúng tôi để thêm truy vấn SQL:

    ... 

Bây giờ, hãy tạo một nguồn dữ liệu đơn giản:

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

Bây giờ, chúng ta có thể điền vào báo cáo:

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

Lưu ý rằng chúng tôi đang chuyển null cho đối số thứ hai vì báo cáo của chúng tôi chưa nhận được bất kỳ tham số nào.

4.1. Thông số

Các thông số hữu ích để chuyển dữ liệu đến công cụ báo cáo mà nó không thể tìm thấy trong nguồn dữ liệu của nó hoặc khi dữ liệu thay đổi tùy thuộc vào các điều kiện thời gian chạy khác nhau.

Chúng tôi cũng có thể thay đổi các phần hoặc thậm chí toàn bộ truy vấn SQL với các tham số nhận được trong thao tác điền báo cáo.

Trước tiên, hãy sửa đổi báo cáo để nhận ba tham số:

       // ... 

Bây giờ, hãy thêm phần tiêu đề để hiển thị tham số tiêu đề :

 // ...           ... 

Tiếp theo, hãy thay đổi truy vấn để sử dụng các tham số minSalaryđiều kiện :

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

Lưu ý các cú pháp khác nhau khi sử dụng tham số điều kiện . Điều này cho công cụ biết rằng tham số không nên được sử dụng như một tham số PreparedStatement tiêu chuẩn , nhưng như thể giá trị của tham số đó sẽ được ghi ban đầu trong truy vấn SQL.

Cuối cùng, hãy chuẩn bị các thông số và điền vào báo cáo:

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, ...);

Lưu ý rằng các khóa của tham số tương ứng với tên tham số trong báo cáo. Nếu công cụ phát hiện một tham số bị thiếu, nó sẽ lấy giá trị từ defaultValueExpression của tham số nếu có.

5. Xuất khẩu

Để xuất báo cáo, trước tiên, chúng tôi khởi tạo một đối tượng của lớp export phù hợp với định dạng tệp mà chúng tôi cần.

Sau đó, chúng tôi đặt báo cáo đã điền trước đó của mình làm đầu vào và xác định nơi xuất tệp kết quả.

Theo tùy chọn, chúng tôi có thể đặt các đối tượng cấu hình báo cáo và xuất tương ứng để tùy chỉnh quá trình xuất.

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. Báo cáo phụ

Báo cáo phụ không khác gì một báo cáo chuẩn được nhúng trong một báo cáo khác.

Đầu tiên, hãy tạo một báo cáo để hiển thị các email của một nhân viên:

Bây giờ, hãy sửa đổi báo cáo nhân viên của chúng tôi để bao gồm báo cáo trước đó:

Lưu ý rằng chúng tôi đang tham chiếu đến báo cáo con theo tên của tệp đã biên dịch và chuyển cho nó kết nối idEaffee và báo cáo hiện tại làm tham số.

Tiếp theo, hãy biên dịch cả hai báo cáo:

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

Mã của chúng tôi để điền và xuất báo cáo không yêu cầu sửa đổi.

7. Kết luận

Trong bài viết này, chúng ta đã có một cái nhìn ngắn gọn về các tính năng cốt lõi của thư viện JasperReports.

Chúng tôi có thể biên dịch và điền các báo cáo với các bản ghi từ cơ sở dữ liệu; chúng tôi đã chuyển các tham số để thay đổi dữ liệu được hiển thị trong báo cáo theo các điều kiện thời gian chạy khác nhau, các báo cáo con được nhúng và xuất chúng sang các định dạng phổ biến nhất.

Mã nguồn hoàn chỉnh cho bài viết này có thể được tìm thấy trên GitHub.