1. 概述
1.1 問題描述
設計報表時,如果遇到「序號」是用漢字數字來表示的,那麼要如何對它進行排序呢,如下:
1.2 解決思路
方案一:資料很少時,可以使用進階排序-自訂順序。也可利用內建資料集實現,詳情請參照文檔:利用內建資料集實現自訂排序。
方案二:在「擴展後排序」中新增公式。因為 FineReport 中沒有將漢字數字轉化為阿拉伯數位的公式,所以我們可以反過來,用 numto() 公式將阿拉伯數字轉化為漢字數字,再將漢字數字與對應的阿拉伯數字聯絡起來。
注:方案二只適用於漢字數字從「一」開始且數字連續的場景。
2. 範例
2.1 準備資料
建立內建資料集,新增兩個欄位「序號」、「項目」,均為字串類型,設計表如下圖所示:
2.2 報表設計
將資料列拖入儲存格,輸入對應的標題,表格樣式設計如下:
2.3 方案一:進階排序
雙擊 A2 儲存格,點選「進階」,設定排列順序為「升冪」,輸入公式:SWITCH($$$,"一",1,"二",2,"三",3,"四",4)。如下圖所示:
2.4 方案二:擴展後排序
選中 A2 儲存格,點選「儲存格屬性>擴展」,設定「擴展後排序」為「升冪」,輸入公式: INARRAY($$$, MAPARRAY(RANGE(COUNT(A2[!0])), NUMTO(item)))。
公式說明如下表:
公式 | 說明 |
---|---|
MAPARRAY(array,fn) | 批量處理陣列,透過 fn 對陣列中的元素進行轉換 array(Array):要轉換的陣列,即 RANGE(COUNT(A2[!0])) fn(Function):處理陣列項目的函式,即 NUMTO(item) |
RANGE(COUNT(A2[!0])) | 傳回陣列: [1,2,3,4],COUNT(A2[!0]) 為計算 A2 儲存格擴展出來的所有值的個數 |
NUMTO(item) | 傳回數位的中文表示。 注:NUMTO()函式不支援小數 |
MAPARRAY(RANGE(COUNT(A2[!0])), NUMTO(item)) | 傳回陣列:[一,二,三,四] |
INARRAY($$$,array) | 傳回儲存格當前值在陣欄 array 中的位置,如果不在 array 中,則傳回 0 |
步驟如下圖所示:
2.5 效果預覽
2.4.1 PC 端
儲存報表,點選「分頁預覽」,效果如下圖所示:
2.4.2 行動端
App 端和 HTML5 端均支援,效果如下圖所示:
3. 範本下載
文檔僅給出方案二範本。
已完成範本可參見:%FR_HOME%\webapps\webroot\WEB-INF\reportlets\doctw\SpecialSubject\OrderReport\漢字數字排序.cpt
點選下載範本:漢字數字排序.cpt