除了元素、屬性、參數之外,JasperReports還有個不容易發現的功能:Group
Group是用來根據特定欄位或表達式對資料進行分組的功能。透過分組,報表資料可以根據該欄位(如部門、課程、客戶等)進行邏輯上的劃分,並能夠在每個組別的開頭或結尾處插入特定內容,如小計、摘要或群組標題。
我想繼續對學生基本資料報表以年級分組,希望報表不同組別的開始都從新的一頁顯示資料。
JasperReports的Group是依據特定的欄位或表達式來進行的,因此相同的值的資料應該連續出現在報表中,否則JasperReports會在遇到不同值的時候將資料視為新的一組,若沒有排序就會變成很多組別但區分的邏輯混亂。
@Override
public List<StudentAndDepartmentDto> getStudentAndDepartmentData() {
QStudentEntity qStudent = QStudentEntity.studentEntity;
QDepartmentEntity qDepartment = QDepartmentEntity.departmentEntity;
return queryFactory.select(Projections.bean(
StudentAndDepartmentDto.class,
qStudent.studentId, qStudent.firstName, qStudent.lastName,
qStudent.gender, qStudent.grade,
qDepartment.departmentId, qDepartment.departmentName,
qDepartment.departmentDesc))
.from(qStudent)
.innerJoin(qDepartment)
.on(qStudent.departmentId.eq(qDepartment.departmentId))
// 以年級由小到大、studentId由小到大進行排序
.orderBy(qStudent.grade.asc(), qStudent.studentId.asc())
.fetch();
}
P${studentNum}
參數移到Group Footer中原先的參數P${studentNum}
是後端程式計算的學生總人數,但是現在Group Footer是顯示各組別的資料,根據情境顯示各組別的學生人數更適合。
要顯示各組別的學生人數,當然也可以新增變數,同樣用後端計算每個年級的人數,再以REPORT_PARAMETERS_MAP傳遞到報表,只是現在有個更簡單的方法,就是使用JasperReports的變數。
變數與程式語言中的變數功能很像,是用來儲存和計算報表資料的工具,我將會於下一篇對變數有深入的介紹。
P${studentNum}
-> 在左側點選「Variable」,在中間的區塊就發現JasperReports非常貼心,自動幫你產生一個「GroupByGrade_COUNT」的變數,Count這個類型顧名思義就是計算數量的,這個變數是在新增Group之後JasperReports預設會產生用來計算每個組別的資料數量的,而我們一個資料就是一個學生,正好可以使用這個變數$V{GroupByGrade_COUNT}
由於資料很多,如果資料都放在一起會導致每個Group很不容易區別,因此我想設定各組別資料都於新的一頁開始。