Jasperreports+jaspersoft studio學習教程(九)- 報表分頁和大量數據內存處理

原文鏈接:https://blog.csdn.net/shiyun123zw/article/details/79221879

9.1 設計報表模板

9.1.1 使用Table組件新建模板(步驟參考教程七)如下:




9.1.2 模板自帶變量




$V{PAGE_NUMBER} :代表當前頁數(可以是頁碼也可以是頁數,通過TextField的計算時間的不同值來設置)

$V{PAGE_COUNT} :當前頁面中記錄的數目

$V{groupname_COUNT} :   代表當前組的記錄數

$V{COLUMN_NUMBER} :列號碼

$V{COLUMN_COUNT} :當前列中記錄的數目(是當前頁裏行的序號,在新頁上會重置爲1)

$V{REPORT_COUNT} :當前文檔中數據源記錄數目。

 

這裏主要使用 $V{PAGE_NUMBER} 來做報表分頁

 

 

對於$V{PAGE_NUMBER}:當evaluationTime="Now"時,即是計算當頁所在哪一頁。 (now:即時執行此表達式)

當evaluationTime="Report"時,計算最後一頁,即總頁數。(Report:整個報表執行完後才執行此表達式)


9.1.3 拖動6個Text Field組件到Page Footer Band中




設置 第幾頁 ,注意 其 Evaluation Time 選中 Now。






設置 共幾頁 ,注意 其 Evaluation Time 選中 Report。





9.1.4 設置 首頁、上一頁、下一頁、末頁 需要使用超鏈接

 

新建一個模板,把 首頁 拷貝過去(這裏使用DemoReport1.jrxml)

點擊首頁顯示Properties ,搜索HyperLink PageException




設置 鏈接 爲 “https://www.baidu.com/”



保存後,以 HTML 方式 Preview 後,點擊首頁跳轉到百度。





9.1.5 設置 首頁、上一頁、下一頁、末頁

 

在 Hyperlink PageExpression 框中輸入時需要注意,我們需要設定變量才能正確的導向是哪一頁

以下是各選擇在HyperlinkPage Expression框中輸入的信息

 

首頁   : "/JasperWeb/JasperServlet9?page=0"

上一頁 :  "/JasperWeb/JasperServlet9?page="+($V{PAGE_NUMBER}-Long.valueOf("1"))

下一頁 :  "/JasperWeb/JasperServlet9?page="+($V{PAGE_NUMBER}+Long.valueOf("1"))

末頁   : "/JasperWeb/JasperServlet9?page=lastPage"

 

保存模板文件後拷貝到JasperWeb項目中


9.2 編寫java代碼,實現分頁邏輯及大量數據內存處理

  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. Map<String,Object> parameters = new HashMap<String,Object>(16);
  3. String pageStr = request.getParameter("page");
  4. HttpSession session = request.getSession();
  5. int pageIndex = 0;
  6. int lastPageIndex = 0;
  7. //list數據源
  8. List<Users> list = new ArrayList<Users>();
  9. for(int i = 1 ; i <= 50 ; i++) {
  10. Users users = new Users(i,"name"+i,"grade"+i,"college"+i,"mobile"+i);
  11. list.add(users);
  12. }
  13. ModelTableSource mts = new ModelTableSource();
  14. mts.setDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
  15. mts.setTableData(new JRBeanCollectionDataSource(list));
  16. List<ModelTableSource> mlist = new ArrayList<ModelTableSource>();
  17. mlist.add(mts);
  18. String jrxmlPath = request.getServletContext().getRealPath("/")+"/jrxml/DemoReport9.jrxml";
  19. //由jrxml文件編譯後生產jasper文件的路徑
  20. String jasperPath = request.getServletContext().getRealPath("/")+"/jasper/DemoReport9.jasper";
  21. PrintWriter out = null;
  22. try {
  23. //編譯jrxml生產jasper文件
  24. JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);
  25. //JasperPrint將數據全部取出,放到session中
  26. JasperPrint jasperPrint = (JasperPrint) session.getAttribute("jasperPrint");
  27. if(null == jasperPrint) {
  28. jasperPrint = this.getJasperPrint(jasperPath, parameters, mlist);
  29. session.setAttribute("jasperPrint", jasperPrint);
  30. }
  31. if(null != jasperPrint.getPages()) {
  32. lastPageIndex = jasperPrint.getPages().size() - 1;
  33. }
  34. if(null == pageStr) {
  35. pageStr = "0";
  36. }
  37. try {
  38. pageIndex = Integer.valueOf(pageStr);
  39. if(pageIndex > 0) {
  40. pageIndex = pageIndex -1 ;
  41. }
  42. } catch (Exception e) {
  43. // 如果得到的非數字字符串
  44. if("lastPage".equals(pageStr)) {
  45. pageIndex = lastPageIndex;
  46. }
  47. }
  48. if (pageIndex < 0) {
  49. pageIndex = 0;
  50. }
  51. if (pageIndex > lastPageIndex) {
  52. pageIndex = lastPageIndex;
  53. }
  54. //將html輸出到瀏覽器上
  55. JRHtmlExporter exporter = new JRHtmlExporter();
  56. response.setCharacterEncoding("UTF-8");
  57. out = response.getWriter();
  58. //分頁
  59. exporter.setParameter(JRExporterParameter.PAGE_INDEX, pageIndex);
  60. exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
  61. exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
  62. exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
  63. exporter.exportReport();
  64. } catch (Exception e) {
  65. e.printStackTrace();
  66. }finally {
  67. out.flush();
  68. out.close();
  69. }
  70. }
  71. private JasperPrint getJasperPrint(String jasperPath, Map<String, Object> parameters, List<?> list) throws JRException {
  72. //解決大數據量保留在內存中,只在內存中保留兩頁,剩下的放入磁盤中
  73. JRFileVirtualizer virtualizer = new JRFileVirtualizer(2, "D:/data");
  74. parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
  75. virtualizer.setReadOnly(true);
  76. return JasperFillManager.fillReport(jasperPath, parameters, new JRBeanCollectionDataSource(list));
  77. }



訪問servlet,如下:




將第三頁存儲在磁盤中。



教程就先寫到這,以後有知識點再加添補。本教程Demo源碼提供,JasperWeb源碼

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章