1. 程式人生 > >Jasperreports+jaspersoft studio學習教程(九)- 報表分頁和大量資料記憶體處理

Jasperreports+jaspersoft studio學習教程(九)- 報表分頁和大量資料記憶體處理

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程式碼,實現分頁邏輯及大量資料記憶體處理

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Map<String,Object> parameters = new HashMap<String,Object>(16);
		String pageStr = request.getParameter("page");
		HttpSession session = request.getSession();
		int pageIndex = 0;
		int lastPageIndex = 0;
		
		//list資料來源
		List<Users> list = new ArrayList<Users>();
		for(int i = 1 ; i <= 50 ; i++) {
			Users users = new Users(i,"name"+i,"grade"+i,"college"+i,"mobile"+i);
			list.add(users);
		}
		ModelTableSource mts = new ModelTableSource();
		mts.setDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
		mts.setTableData(new JRBeanCollectionDataSource(list));
		List<ModelTableSource> mlist = new ArrayList<ModelTableSource>();
		mlist.add(mts);
		
		String jrxmlPath = request.getServletContext().getRealPath("/")+"/jrxml/DemoReport9.jrxml";
		//由jrxml檔案編譯後生產jasper檔案的路徑
		String jasperPath = request.getServletContext().getRealPath("/")+"/jasper/DemoReport9.jasper";
		PrintWriter out = null;
		try {
           
			//編譯jrxml生產jasper檔案
			JasperCompileManager.compileReportToFile(jrxmlPath, jasperPath);
			
            //JasperPrint將資料全部取出,放到session中
			JasperPrint jasperPrint = (JasperPrint) session.getAttribute("jasperPrint");
			if(null == jasperPrint) {
				jasperPrint = this.getJasperPrint(jasperPath, parameters, mlist);
				session.setAttribute("jasperPrint", jasperPrint);
			}
            
           
    		if(null != jasperPrint.getPages()) {
    			lastPageIndex = jasperPrint.getPages().size() - 1;
    		}
    		if(null == pageStr) {
    			pageStr = "0";
    		}
    		try {
    			pageIndex = Integer.valueOf(pageStr);
    			if(pageIndex > 0) {
    				pageIndex = pageIndex -1 ;
    			}
    		} catch (Exception e) {
    			// 如果得到的非數字字串
    			if("lastPage".equals(pageStr)) {
    				pageIndex = lastPageIndex;
    			}
    		}
    		
    		if (pageIndex < 0) {
    			pageIndex = 0;
    		}
    		if (pageIndex > lastPageIndex) {
    			pageIndex = lastPageIndex;
    		}
    		
    		//將html輸出到瀏覽器上
            JRHtmlExporter exporter = new JRHtmlExporter();
            response.setCharacterEncoding("UTF-8");
    		out = response.getWriter();
    		//分頁
    		exporter.setParameter(JRExporterParameter.PAGE_INDEX, pageIndex);
    		exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
    		exporter.setParameter(JRExporterParameter.OUTPUT_WRITER, out);
    		exporter.setParameter(JRHtmlExporterParameter.IS_USING_IMAGES_TO_ALIGN, Boolean.FALSE);
    		exporter.exportReport();
    		
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
        	out.flush();
        	out.close();
        }
	}
	
	
	private JasperPrint getJasperPrint(String jasperPath, Map<String, Object> parameters, List<?> list) throws JRException {
		//解決大資料量保留在記憶體中,只在記憶體中保留兩頁,剩下的放入磁碟中
		JRFileVirtualizer virtualizer = new JRFileVirtualizer(2, "D:/data");
		parameters.put(JRParameter.REPORT_VIRTUALIZER, virtualizer);
		virtualizer.setReadOnly(true);
		
		return JasperFillManager.fillReport(jasperPath, parameters, new JRBeanCollectionDataSource(list));	 
	}




訪問servlet,如下:



將第三頁儲存在磁碟中。



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