iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0

報表時常會搭配圖表來顯示想表達的資訊,JasperReports也提供了Chart元素,讓我們可以快速建立與配置圖表。

Chart元素-圓餅圖

我以學生資料表為範例,想以Chart元素繪製出科系人數比例的圓餅圖。

建立Dataset

圖表的資料有時不會跟報表資料一樣,可能是經過計算或是有其他資料來源,因此可以在左下區域報表名稱的地方點右鍵新增Dataset,來放入圖表的DataSource(以下稱Dataset)。

接著會跳出視窗,在這個範例中,圖表Dataset我想從後端傳過來,所以在設定好名稱後,這裡我選擇「Create an empty dataset」。

接著可以在左下區域找到剛剛所新增的Dataset,我們可以發現Dataset也有自己的Parameters、Fields、Variables,甚至Groups。

科系人數比例的圓餅圖中,我需要用到科系名稱(departmentDesc)、科系總人數(departmentTotalNum)、科系人數比例(departmentRatio),因此我在Dataset中新增這三個Fields。

設定參數傳遞Dataset

圖表Dataset是從後端傳過來的話,需要對應到報表的Chart元素中,因為是要傳遞到學生資料表這張報表(主資料),我在報表主資料的REPORT_PARAMETERS_MAP新增一個參數,用來傳遞圖表的Dataset。

注意傳遞的是Dataset,參數型別要用 net.sf.jasperreports.engine.data.JRBeanCollectionDataSource 這個Class。

設定Chart元素

Dataset

圖表是這個報表彙整的資訊,因此常放在Summary。我新增一個Summary Band,將「Chart」元素直接拖曳到Band的區域,並在跳出的設定視窗中選擇 「Pie Chart」 ,點選Next。

接著要設定圓餅圖的Dataset, 如果是要用原先報表的資料來作圖是選擇「Main Report」,這個範例中是選擇自己建立的DepartmentNumDataset

下方表達式的設定要 選擇「Use a JRDatasource expression」 ,表達式為參數$P{DepartmentNumDataset}的值,就能夠取得由後端傳遞過來的Dataset。

圖表其他設定

  • Value: 每個區段(扇形 Slice)值的依據,我以科系總人數$F{departmentTotalNum}來作為區段的表達式
  • Label: 每個區段(扇形 Slice)的標籤,我想顯示「科系名稱 + 百分比」,因此表達式為$F{departmentDesc} + " " + $F{departmentRatio} + "%"
  • Key: 圖例的名稱,我使用科系名稱$F{departmentDesc}
  • Max slices to show: 這是設定最多要顯示幾個區段(扇形 Slice),超過的部分會集中以「Others」顯示,這個範例中科系才四個,因此我使用預設值

    點擊Finish之後,就會看到模板上圖表元素已經配置完成,可以直接用滑鼠選取調整位置和大小。

後端傳遞Dataset參數

後端一樣先查詢報表的資料,將學生基本資料計算後(計算過程先省略)可以得到圖表所需的Dataset,最後將圖表資料放到parametersMap就好囉,注意型別是JRBeanCollectionDataSource

@Data
@NoArgsConstructor
@AllArgsConstructor
// 圖表Dataset
public class DepartmentDataSourceModel {
    private String departmentDesc;

    private Integer departmentTotalNum;

    private BigDecimal departmentRatio;
}
// 1. 查詢學生基本資料(報表資料)
List<StudentDataReportModel> studentDataReportModelList = reportDemoService.getStudentAndDepartmentData();

// 2. 計算科系人數(計算圖表資料) 計算過程省略
List<DepartmentDataSourceModel> departmentDataSourceModelList = this.calDepartmentDataSource(studentDataReportModelList);

// 3. 設定報表參數
Map<String, Object> parametersMap = new HashMap<>();
parametersMap.put("DepartmentNumDataset", new JRBeanCollectionDataSource(departmentDataSourceModelList));

後面的步驟與一般的報表匯出相同。

匯出報表

可以在匯出報表的最後Summary的位置看到圖表(我的MockData有點太平均了)。
不過JasperReports本身沒有匯出圖表的功能,其實是整合了JFreeChart API,使用JFreeChart來作圖。圖表是一般圖片格式(JPEG、PNG等),不是SVG,所以解析度沒有很好。

JasperReports的Chart元素使用起來是簡單方便,但缺點也很明顯,相較於Microsoft Office軟體的圖表,JasperReports的圖表是圖片格式,缺乏與資料的互動性與彈性,要修改的話必須重新繪出報表,而且圖片的畫面比較陽春。網路上的經驗文也比較少,多數是官方的資訊,也許是他的缺點導致較少人使用。


Reference


上一篇
JasperReports-static text、text field適應內容高度
下一篇
JasperReports-一些小技巧
系列文
Java工程師的報表入門與實作30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言