1. 程式人生 > >Jasperreports6.3.1+Jaspersoft studio6.3.1進行報表開發實戰教程(五)

Jasperreports6.3.1+Jaspersoft studio6.3.1進行報表開發實戰教程(五)

用實體類實現報表資料填充

建立一個實體類

上一節已經介紹瞭如何傳入引數填充報表,這一節要用另一個數據源來填充報表,也就是上一節介紹到的jasper.fill()方法的第三個引數JRDataSource,JavaBeanColletion可以用來生成一個JRDataSource的實現 類,所以我們可以傳入實體類物件集合來實現報表資料填充。 
這個實體類很簡單,就是學生的各科成績,排名等這些引數。

public class StudentScore {
    private String name;
    private String id;
    private String rank;
    private
String yuwne; private String shuxue; private String english; private String shengwu; private String wuli; private String huaxue; private String rankone; public StudentScore(String name, String id, String rank, String yuwne, String shuxue, String english, String shengwu, String wuli, String huaxue, String rankone) { super(); this
.name = name; this.id = id; this.rank = rank; this.yuwne = yuwne; this.shuxue = shuxue; this.english = english; this.shengwu = shengwu; this.wuli = wuli; this.huaxue = huaxue; this.rankone = rankone; } }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

建立一個可以生成Bean物件的Jar包

注意:在模板設計中,Jaspersoft studio只能識別Jar包檔案,如果要在模板中加入實體類物件集合作為資料來源,就必須將生成實體類物件集合的一個工具類,還有實體類本身打包成一個Jar然後在Jaspersoft studio中匯入該Jar包,否則studio是讀不到這個實體類的物件的。 
該工具類由一個靜態方法組成,該方法返回實體類物件的集合,一定要記住該靜態方法名,後面會用到。

package test.bean;

import java.util.ArrayList;

public class StudentBeanFactory {

    public static ArrayList<StudentScore> getBeanCollection(){
           ArrayList<StudentScore> dataList=new ArrayList<>();
            dataList.add(new StudentScore("王小白", "95279527", "3", "102", "113", "108", "80", "82", "83", "6"));
            dataList.add(new StudentScore("王小紅", "95289528", "6", "103", "101", "134", "81", "76", "68", "10"));
        dataList.add(new StudentScore("王小黑", "95299529", "11", "99", "123", "133", "79", "88", "92", "12"));
        return dataList;
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

然後用Eclipse將工具類和實體類匯出成一個Jar包 
這裡寫圖片描述

選擇Export為Jar 
這裡寫圖片描述

找到bean包,並只選中這個包,選擇好儲存的路徑與包名,點選Finish即可生成一個Jar包 
這裡寫圖片描述 
這裡寫圖片描述

在Jaspersoft studio匯入該jar包到專案中,跟Eclipse相同的操作。 
這裡寫圖片描述 
點選External jar包,找到剛才生成的jar包,點選ok匯入。 
這裡寫圖片描述

在JasperSoft Studio中建立一個實體類物件集合資料來源

上面步驟完成後,建立一個新的adapter,命名為JavaBeanAdapter以Collection of JavaBeans為資料來源 
這裡寫圖片描述 
點選Next出現一個對話窗,這一步很關鍵,要把上面工具類的靜態方法填入第二個輸入框中,第二個輸入框填入getBeanCollection,與工具類StudnetBeanFactory裡的靜態方法名一致。第一個輸入框就是選定生成實體類物件集合的工具類,點選右側的…

這裡寫圖片描述 
出現一個搜尋框,填入student會出自動出現我們所匯入的jar包裡的類,注意如果沒有匯入Jar包,這裡會無法搜尋出我們所需要的結果。 
這裡寫圖片描述 
點選OK後這個Adatper就建立完成了,接下來還要將之匯入到報表模板中。 
在專案結構預覽outline中右鍵,然後選中Dataset and query進行配置資料來源 
這裡寫圖片描述 
選中我們先前建立的資料來源JavaBeanAdapter,Class框跟工具類一樣輸入student就會出現實體類StudentScore,選中後會發現下面的空白框裡出現了實體類的欄位,按照圖中步驟操作,則實體類欄位就成功地匯入到模板中,我們就可以去引用它了。 
這裡寫圖片描述

由下圖可以看到實體類的欄位已經成功地匯入模板了。 
這裡寫圖片描述 
接下來,只需把原來的引數換為實體類即可。 
如果這時把Fields裡的實體類拉入報表模板時,會報如下錯誤。 
這裡寫圖片描述 
意思是不能從SubDataSet中拉欄位進模板中,這一步出現的原因是我在Outline這裡點的不是Dataset and query,而是新建了一個Dataset,從上面的圖就可以看出我的實體類欄位單獨出現在了MyBeanSet這裡,這裡的欄位看來是不能直接拉入的。 
將這個資料來源刪掉,重新設定,這點要點選Dataset and query,其實我上面的步驟是正確的,只是我以前建立了這個資料來源而忘了刪掉,於是就出現了不可拉入的錯誤。 
這裡寫圖片描述 
正確的欄位資料來源應該是在主結構視覺中的Fields裡的,如下圖所示。 
這裡寫圖片描述 
然後將之拉入到對應位置,設定與引數的設定一樣,然後記得將變數total的表示式也要改為所有欄位相加的和。 
PS:yuwen被我筆誤寫成了yuwne,慚愧。。 
這裡寫圖片描述 
記得改total變數的表示式。 
這裡寫圖片描述 
點選Preview進行預覽。 
這裡寫圖片描述 
這裡寫圖片描述 
可以看到,我們輸入了三條資料,所以就填充生成了三個表格,那為什麼第一頁只生成了一個表格,而第二頁就生成了二個表格呢。後面會詳細說到,這與報表模板的元素結構有關。

將報表模板匯入Java工程中,生成一個Html.

將報表模板編譯成二進位制檔案,參考以前的步驟,熟悉的配方。 
這裡寫圖片描述 
呼叫Jasperreports 方法,生成一個Html檔案,方法如下。

package test;

import java.util.ArrayList;
import java.util.HashMap;


import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import test.bean.StudentBeanFactory;
import test.bean.StudentScore;

public class JasperBeanTest {
    public static void main(String[] args) {
        //1.設定模板二進位制檔案路徑,一定要可以通過該路徑找到該檔案
        String reportPath="./src/JasperBeanSample.jasper";

        //2.設定報表的外部引數,map集合,這裡要注意map的key值一定要與模板裡Parameters的名字一致
        HashMap<String,Object> map=new HashMap<>();
        //3.新建一個集合,用於存放實體類物件
        ArrayList<StudentScore> dataList=StudentBeanFactory.getBeanCollection();

        //4.用實體類物件集合生成一個可以傳入的資料來源
        JRBeanCollectionDataSource beanDataSource =
                  new JRBeanCollectionDataSource(dataList);
        try {
            //3.通過JasperFillManager工具進行填充報表,填充成功後會生成一個JasperPring檔案,該檔案用於輸出
            JasperPrint jasperPrint=JasperFillManager.fillReport(reportPath, map,beanDataSource);
            //4.設定目標檔案輸出的路徑
             String desFilePath="./src/JasperSampleBeanTest.html";
             //5.通過JasperExportManager管理工具進行報表輸出文件,此外設定為輸出Html檔案
             JasperExportManager.exportReportToHtmlFile(jasperPrint,desFilePath);
        } catch (JRException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

執行工程,生成Html檔案,重新整理一下工程目錄,可以看到新生成的Html檔案,點開預覽,可以看到三個實體類物件都已經傳進去了。 
這裡寫圖片描述 
如果我不只想傳三條資料呢,是不是我們放入的Jar包只有三個學生成績的物件,所以在Java工程中就只能放三條資料呢。我們在生成物件的靜態方法裡再新增一條資料,然後執行工程,看這條資料會不會被填充進去呢。

public static ArrayList<StudentScore> getBeanCollection() {
        ArrayList<StudentScore> dataList = new ArrayList<>();
        dataList.add(new StudentScore("王小白", "95279527", "3", "102", "113", "108", "80", "82", "83", "6"));
        dataList.add(new StudentScore("王小紅", "95289528", "6", "103", "101", "134", "81", "76", "68", "10"));
        dataList.add(new StudentScore("王小黑", "95299529", "11", "99", "123", "133", "79", "88", "92", "12"));
        dataList.add(new StudentScore("王大白", "85298529", "21", "88", "100", "100", "66", "77", "94", "81"));
        return dataList;
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

可以看到生成的Html裡新添加了一個表格,這就是我們新新增的王大白同學,由此可知,放入模板裡的Jar包只是一個模板,不管裡面放幾條資料,生成的二進位制檔案放到Java工程中都不會有傳入資料條數的限制,即是你會傳幾條資料,就會生成幾個表格。 
這裡寫圖片描述