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工程中都不會有傳入資料條數的限制,即是你會傳幾條資料,就會生成幾個表格。