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原始碼