您好,登錄后才能下訂單哦!
小編今天帶大家了解大數據中怎么對報表數據添加目錄,文中知識點介紹的非常詳細。覺得有幫助的朋友可以跟著小編一起瀏覽文章的內容,希望能夠幫助更多想解決這個問題的朋友找到問題的答案,下面跟著小編一起深入學習“大數據中怎么對報表數據添加目錄”的知識吧。
需求描述:
在做一些類似 word 報告格式報表時,為了有更好的閱讀效果,經常需要在首頁增加一個目錄導航頁,這樣就能夠快速的知道關心的數據在第幾頁,但是報表不同于 word 文檔,word 文檔中格式都是固定的,所以能夠方便快速的生成目錄頁,在報表中數據都是動態變化的,并且通常會涉及到動態擴展,這樣很難固定目錄項,并且由于數據動態擴展,對應的頁碼也很難精確獲得,下面通過一個實例看下,如果在報表中動態增加目錄。
解決方案:
報表數據是動態的,所以設計時就不能用固定的目錄,需要報表計算后才能知道數據在第幾頁,潤乾報表提供了一個報表計算偵聽類,在 java 程序中可以動態獲取報表計算后的結果,并能夠在程序中動態更改單元格的值。
首先,看下報表模板的設計界面:
這個報表要對訂單數據按照地區進行匯總分析,并展示詳細數據,要求目錄中以地區為導航進行設置,報表前 5 行是目錄頁,第三行中,概要分析一般是固定的,這里就寫了固定一行,頁碼設置 2 就行。
A4:=ds1.group(貨主地區; 貨主地區:1),表達式按照地區進行分組,也就是目錄這塊按照地區進行展示,對應 E4 單元格后續要設置成目錄頁,此處暫時為空。
A5:目錄通常在第一頁,所以此處設置一個行后分頁
A7:就是一個固定的匯總描述,里邊可以用字符串拼接方式將固定文本和動態數據拼接在一起展示。
A8:=ds1.group(貨主地區; 貨主地區:1),按照地區進行分組
A9:對該地區數據做一個匯總說明
A10:=ds1.select(訂單 ID),取數訂單數據,B10 往后依次類推。
將 A9,A10,A11,A12 單元格的左主格設置成 A8,此片數據根據 A8 進行縱向擴展,這樣報表展示結果為:
這里可以看到,目錄項處列出了對應地區,接下來看下,如果給地區增加對應頁碼。
從報表結果中看到,第一頁中的目錄名稱和報表中的地區名稱相同,這樣就可以根據這兩個名稱做匹配,判斷如果名稱相同獲取數據區域的名稱所在的頁碼,放到對應目錄行就行,如數據區域的“東北”在第 2 頁,那么目錄中東北的頁碼應該為 2,接下來看下,如何給目錄設置動態的頁碼。
這里就用到了之前說到的報表偵聽類的使用,源碼如下:
import com.raqsoft.common.Area; import com.raqsoft.report.usermodel.Context; import com.raqsoft.report.usermodel.IPagerListener; import com.raqsoft.report.usermodel.IReport; import com.raqsoft.report.usermodel.IReportListener; import com.raqsoft.report.usermodel.PageBuilder; import com.raqsoft.report.util.ReportUtils; public class createmulu implements IReportListener { public void afterCalc(Context arg0, IReport arg2) { PageBuilder arg1 = null; try { arg1 = new PageBuilder(arg2); } catch (Throwable e1) { // TODO Auto-generated catch block e1.printStackTrace(); } System.out.println("報表總頁數"+arg1.getPageCount()); IReport p1; try { p1=arg1.getPage(1);//目錄通常在第一頁,所以獲取第一頁為目錄頁 int page=2;//設置數據初始循環頁,通常為第二頁 for(int i=3;i<=p1.getRowCount();i++){//目錄行從第三行開始 String muluName=(String)p1.getCell(i, 2).getValue() ;//報表中設置第二頁為目錄名稱 for(int j=page;j<=arg1.getPageCount();j++){//按照頁數進行循環,分別取分頁后每頁報表對象 for(int k=1;k<=arg1.getPage(j).getRowCount();k++){//每頁中按照每行進行循環 String mName=arg1.getPage(j).getCell(k,1).getValue() != null ? arg1.getPage(j).getCell(k,1).getValue().toString() : "";//本例中目錄項在報表中的第一列,也就是A8單元格 if(mName!="" && mName==muluName){//判斷每頁中的目錄項和第一頁中的目錄名稱是否相同 arg2.getCell(i, 5).setValue(j);//如果相同,則設置目錄頁第5列對應的值為對應頁碼,注意,此處是arg2對象 arg2.getCell(i, 5).setHyperlink("javaScript:toPage('report1',"+j+")");//設置超鏈接 page=j;//為提高計算效率,下次在循環時,不用從第2頁開始,從上次終端的頁碼開始就行 break;//找到頁碼,跳出此處循環,提高效率 } } } } } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void beforeCalc(Context arg0, IReport arg1) { } }
核心思路就是在類中根據名稱進行匹配,獲取頁碼,放到對應單元格中,將編譯好的類放到報表類路徑中,如:應用的 WEB-INF\classes 下,注意如果有包路徑,此處要要帶相應的路徑,放置過去后重啟應用,在頁面端訪問報表,結果如下:
可以看到,目錄后邊會生成對應的頁碼,word 中目錄有個功能點是,點擊頁碼,能夠快速跳轉到對應的頁數,報表中同樣可以增加對應的功能,報表提供了一個跳轉頁數的 js 函數,toPage,在 java 類中,在對應的頁碼單元格設置了一個超鏈接,調用這個 js 就行:
arg2.getCell(i, 5).setHyperlink("javaScript:toPage('report1',"+j+")");
這樣,在頁面端點擊頁碼,就能夠快速跳轉到對應頁數,當然,此功能要求報表在頁面端分頁后才有效,否則無法跳轉,并且如果導出到 word 的話,只能顯示頁數,無法跳轉。
通過這個例子可以看到,通過拿目錄項中的單元格數據和數據表中的單元格進行匹配,來獲取頁碼,但是在實際使用中,目錄頁中的目錄名稱和報表中的數據名稱可能并不完全一致,比如目錄頁中叫東北,報表數據中叫東北地區,很難嚴格匹配,這樣可以換種變通的方法,報表單元格屬性欄中有個注釋屬性,可以在這個里邊寫上和目錄項匹配的值,然后 java 類中可以根據這個屬性的值做匹配,這樣能夠實現更加靈活的效果。
感謝大家的閱讀,以上就是“大數據中怎么對報表數據添加目錄”的全部內容了,學會的朋友趕緊操作起來吧。相信億速云小編一定會給大家帶來更優質的文章。謝謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。