前言:做這個一定要有耐心,因為報表本就是數據雜糅到規整的過程,這篇心得會細講每一步操作,如果只想着一眼到位,建議close tab
在公司中遇到項目,大概是一個這樣的需求,有一個列表和一個標題,需要把這些數據一條條的遍歷在報表中,然后加個標題,這些都是來自項目里的變量
那么json格式就應該是這樣的,下面我會慢慢說,以例子說明,都會標注
解釋:為什么是這樣,第一,報表中有固定單一屬性區域,和自動遍歷區域,如下圖,那么json的子分類肯定分為兩類
{ "dataa": [ { "country": "china" }, { "qq": "ok" }, { "qq": "no" }] }
圖中1.2.3步為基本配置,左邊的三個字段,dataa(json里的一級key)、qq(二級集合里的key)、country(二級集合里的key)
但結果往往是出人意料的,具體java代碼如下
1 @RequestMapping(value = "/list.html") 2 public String getOrderList(Model model) { 3 InputStream input = new ByteArrayInputStream("\"dataa\": [{ \"country\":\"china\"},{ \"qq\":\"ok\" },{ \"qq\":\"no\" }] }".getBytes()); 4 JRDataSource jrDataSource = null; 5 try { 6 jrDataSource = new JsonDataSource(input, "dataa"); //第一個參數寫入json數據,第二個參數,以該節點為報表解析節點 7 } catch (JRException e) { 8 e.printStackTrace(); 9 } 10 // 動態指定報表模板url 11 model.addAttribute("url", "/WEB-INF/jasper/report/cod1.jasper"); //編譯好的報表文件 12 model.addAttribute("format", "pdf"); // 報表格式 13 model.addAttribute("jrMainDataSource", jrDataSource); 14 return "iReportView"; // 對應jasper-defs.xml中的bean id 15 16 }
注意看我的json格式,兩種類型讀在dataa : [ xx, xx ] 內
按常理說,json格式 [ ] 內存放的應該是統一類型的序列集合,那么這時存放的既有遍歷的集合也有單一屬性,為什么是這樣!
解釋:這里實際上是做了封裝,注意到集合里(指上文dataa對象里的內容,也就是[ ] 內的內容稱為集合)的每個元素都有key=>value的形式了吧,在底層,他首先會遍歷取這樣的一個集合里,根據一樣的key來判斷是否是同一類的組合,然后進行遍歷
說白了,就是這個集合里,如果key都一致,也就是都是qq的key的話,然后報表的遍歷區里有qq這個字段,那么他就會自動遍歷集合里所有的key=qq的組合,然后渲染在報表的一行行里
那么,你想在報表里取標題也很簡單,直接將字段以集合里的,key命名即可取出
------------------------------------------------------------------------------------------------------------------------------------------------------------------
好了,接下來,就是你自己修飾報表的地方了,有什么不懂可以留言,一般常在,盡量幫你解決,伸出小手點個贊,謝謝