Bộ sưu tập

Sử dụng Bean Datasource và Table để tạo nhiều danh sách trong báo cáo với JasperReports


https://codersontrang.com/2013/10/21/su-dung-bean-datasource-va-table-de-tao-nhieu-danh-sach-trong-bao-cao-voi-jasperreports/

Bài viết “Tạo báo cáo với JasperReports” đã đề cập đến cách sử dụng thành phần table trong JasperReports. Như một sự thay thế cho thành phần Subreport trong bài viết “Sử dụng Bean Datasource và Subreport để tạo nhiều danh sách trong báo cáo với JasperReports“, bài viết này sẽ chỉ ra cách thành phần Table trong JasperReports hiển thị dữ liệu từ Bean datasource.

Dùng iReport để tạo ra file report có tên là Table_BeanDatasource.jrxml với hai dataset như hình dưới đây

Beandatasource_table_1

Dataset dsStudents chứa một danh sách các sinh viên với mỗi sinh viên được biểu diễn bởi các thuộc tính như id, name, mark. Dataset thứ hai dsClasses chứa danh sách các lớp học với mỗi lớp học idname.

Tạo ra hai tham số là mainClassDataSourcemainStudentDataSource như hình dưới đây

Beandatasource_table_2

Trong mục Parameter Class của hai tham số trên, ta đặt giá trị cho chúng là net.sf.jasperreports.engine.data.JRBeanCollectionDataSource

Beandatasource_table_2_1

Beandatasource_table_2_2

Kéo hai Table vào trong nội dung của file báo cáo, mỗi Table sẽ lần lượt có dataset là hai dataset mà chúng ta tạo ở trên

Beandatasource_table_3

Đi vào việc thiết kế chi tiết nội dung của các Table đã tạo ở trên, ta điền giá trị lấy từ các dataset như hình dưới đây

Table 1 hiển thị danh sách các sinh viên

Beandatasource_table_4

Table 2 hiển thị danh sách các lớp học

Beandatasource_table_5

Nhấp chuột phải vào từng table trên file báo cáo, sau đó chọn Edit table datasource, với mỗi table ta chọn dataset tương ứng cho nó. Trong phần Connection/Datasource Expression ta chọn Use datasource expression cùng với việc điền giá trị của biểu thức là hai tham số mà ta đã tạo ở phía trên là $P{mainStudentDataSource}, $P{mainClassDataSource}

Beandatasource_table_7

Beandatasource_table_8

Như vậy là phần tạo file báo cáo đã hoàn thiện, kế tiếp tạo một Java project có cấu trúc như hình dưới đây. File báo cáo được tạo ở trên sẽ được đặt trong source folder có tên là reports.

Beandatasource_table_10

Trong project này, các file Clazz.java, Student.java, ClazzDAO.java, StudentDAO.java sẽ có nội dung như ở bài viết “Sử dụng Bean Datasource và Subreport để tạo nhiều danh sách trong báo cáo với JasperReports“. Trong bài viết này ta chỉ đề cập đến nội dung của file chương trình là DemoMain.java

DemoMain.java

 package jasperreport.table.beandatasource;  

 import java.io.File;  
 import java.io.FileOutputStream;  
 import java.io.OutputStream;  
 import java.util.HashMap;  
 import java.util.Map;  
 import net.sf.jasperreports.engine.JREmptyDataSource;  
 import net.sf.jasperreports.engine.JasperCompileManager;  
 import net.sf.jasperreports.engine.JasperExportManager;  
 import net.sf.jasperreports.engine.JasperFillManager;  
 import net.sf.jasperreports.engine.JasperPrint;  
 import net.sf.jasperreports.engine.JasperReport;  
 import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;  
 import net.sf.jasperreports.engine.util.JRLoader;  

 public class DemoMain {  
      public static void main(String [] args){  
           Map<String, Object> parameters = new HashMap<String, Object>();  
           try {   
                parameters.put("mainStudentDataSource", new JRBeanCollectionDataSource(StudentDAO.getStudentList()));  
                parameters.put("mainClassDataSource", new JRBeanCollectionDataSource(ClazzDAO.getClassList()));  

                JasperReport jr = loadJasperReport("reports/Table_BeanDatasource");  
                JasperPrint jp = JasperFillManager.fillReport(jr, parameters, new JREmptyDataSource());  

                OutputStream os = new FileOutputStream("D:/StudentReport.pdf");   

                JasperExportManager.exportReportToPdfStream(jp, os);   
                os.flush();   
                os.close();   
           } catch (Exception e) {   
                e.printStackTrace();   
           }   
      }  

      private static JasperReport loadJasperReport(String reportName){  
           try{  
                File f = new File(reportName+".jasper");  
                if(!f.exists()){  
                     JasperCompileManager.compileReportToFile(reportName+".jrxml", reportName+".jasper");  
                     f = new File(reportName+".jasper");  
                }  
                JasperReport jr = (JasperReport) JRLoader.loadObject(f);  
                return jr;  
           }catch(Exception e){  
                e.printStackTrace();  
           }  
           return null;  
      }   
 }  

Để ý rằng các tham số $P{mainStudentDataSource}$P{mainClassDataSource} lần lượt được đặt giá trị đến các bean datasource của danh sách sinh viên và lớp học tương ứng.

Chạy chương trình một file báo cáo StudentReport.pdf được sinh ra với nội dung gồm danh sách sinh viên và lớp học như hình dưới đây:

Beandatasource_table_9

Như vậy qua bài viết, ta hiểu được cách dùng Table kếp hợp với Bean datasource để tạo ra một báo với nhiều danh sách trong JasperReports. Như đã thấy trong loạt bài viết về JasperReports của blog này, việc tạo ra báo cáo với nhiều danh sách lấy từ các nguồn khác nhau có rất nhiều cách làm, và việc của chúng ta là lựa chọn giữa các cách để đáp ứng được yêu cầu công việc một cách hợp lý nhất.

Good luck!

Advertisements

2 comments on “Sử dụng Bean Datasource và Table để tạo nhiều danh sách trong báo cáo với JasperReports

  1. Trong mục Parameter Class của hai tham số trên, ta đặt giá trị cho chúng là net.sf.jasperreports.engine.data.JRBeanCollectionDataSource.
    Khi tôi thực hiện đến bước này lúc biên dịch luôn bị lỗi. Mong anh chỉ giúp. Thanks.

    Số lượt thích

Trả lời

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Đăng xuất /  Thay đổi )

Google photo

Bạn đang bình luận bằng tài khoản Google Đăng xuất /  Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Đăng xuất /  Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Đăng xuất /  Thay đổi )

Connecting to %s