1. 程式人生 > >Jasperreports+jaspersoft studio學習教程(八)- 子報表Subreport(父子報表互相傳值)

Jasperreports+jaspersoft studio學習教程(八)- 子報表Subreport(父子報表互相傳值)

       有很多人都說Jasperreports不適合中國式複雜報表,實際上運用好父子報表可以解決大部分問題了。例如下面的表。每個學生的學科數目不固定,且每個學生後有相當於小計的平均分。有點複雜度的報表,可以使用子報表解決。


8.1 設計報表模板

8.1.1 新建主模板DemoReport6_main.jrxml,建立Paramters :title(java.lang.String)、date(java.lang.String)、SUBREPORT_DIR(java.lang.String),建立Fields :stuNo(java.lang.Integer)、

stuName(java.lang.String)、subjectList(java.util.List)


8.1.2 設計模板表頭如下,注意寬度:


8.1.3 新建子模板DemoReport6_sub.jrxml,只保留DetailBand(Height設定為20),並設定模板的寬500,高20,且四周Margin都為0


8.1.4 轉到DemoReport6_main主模板,將Subreport元件拖入到Detail中,跳出Subreport介面



8.1.5 將stuNo和stuName拖入到Detail中


8.1.6 轉到DemoReport6_sub子模板,新建Fields:subjectName(String)、teacherName(String)、score(java.lang.Double).拖入到Detail中,注意寬度和主模板保持一致


8.1.7 新建Variables,命名為averageScore



8.1.8 轉回DemoReport6_mian主模組,新建Variables,命名為getAverageScore


拖入到Detail Band中,設定好字型樣式



點選 $V{getAverageScore} 顯示Properties,設定Appearance中Position Type選中為Fix Relation To Bottom(同樣將“平均分”如此設定)


設定TextField的Evaluation Time 選中為Band


8.1.9 將Subreport、$F{stuNo}、$F{stuName}放進一個Element Group裡,直接在source中新增(未找到圖形化操作)

<detail>

       ...

           <elementGroup>

              <subreport>

                  ...

              </subreport>

              <textField>

                  ... <textFieldExpression><![CDATA[$F{stuNo}]]></textFieldExpression>

              </textField>

              <textField>

                  ...

                  <textFieldExpression><![CDATA[$F{stuName}]]></textFieldExpression>

              </textField>

           </elementGroup>

       ...

    </detail>

儲存後:

8.1.10 點選 $F{stuNo} 顯示Properties,設定Position Type 為Float,Stretch Type為 ElementGroupHeight,把stuNo和Subreport也如此設定。


8.1.11 點選Subreport 顯示Properties,在Subreport中設定Exception為$P{SUBREPORT_DIR}+"DemoReport6_sub.jasper",Data Source Expression為

newnet.sf.jasperreports.engine.data.JRBeanCollectionDataSource($F{subjectList})



點選 Edit Return Values


儲存主模板,子模板,放到專案中的jrxml中。


8.2 編寫Servlet注入資料來源

8.2.1 新建 Student類和Subject類

package com.jasper.bean;

import java.util.ArrayList;
import java.util.List;

public class Student {
	
	//注意和模板中資料型別保持一致
private Integer stuNo; 
	
	private String stuName;
	
	private List<Subject> subjectList = new ArrayList<Subject>();

   // get、set方法省略

}
package com.jasper.bean;

public class Subject {
	
	private String subjectName;
	
	private String teacherName;
	
	private Double score;

 // get、set方法省略

}


8.2.2 新建JasperServlet6,doGet內容如下:


protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
		Map<String,Object> parameters = new HashMap<String,Object>(16);
		
		//組裝list資料來源
		Subject sub1 = new Subject("語文","張老師",80.0);
		Subject sub2 = new Subject("數學","王老師",90.0);
		Subject sub3 = new Subject("物理","孫老師",46.0);
		Subject sub4 = new Subject("政治","李老師",50.0);
		List<Student> list = new ArrayList<Student>();
		
		Student stu1 = new Student();
		stu1.setStuNo(101);
		stu1.setStuName("小明");
		List<Subject> sublist1 = new ArrayList<Subject>();
		sublist1.add(sub1);
		sublist1.add(sub2);
		stu1.setSubjectList(sublist1);
		
		Student stu2 = new Student();
		stu2.setStuNo(102);
		stu2.setStuName("小雨");
		List<Subject> sublist2 = new ArrayList<Subject>();
		sublist2.add(sub2);
		sublist2.add(sub3);
		sublist2.add(sub4);
		stu2.setSubjectList(sublist2);
		
		Student stu3 = new Student();
		stu3.setStuNo(103);
		stu3.setStuName("小東");
		List<Subject> sublist3 = new ArrayList<Subject>();
		sublist3.add(sub4);
		sublist3.add(sub3);
		stu3.setSubjectList(sublist3);
		
		list.add(stu1);
		list.add(stu2);
		list.add(stu3);
		
		String mainjrxmlPath = request.getServletContext().getRealPath("/")+"/jrxml/DemoReport6_main.jrxml";
		String subjrxmlPath = request.getServletContext().getRealPath("/")+"/jrxml/DemoReport6_sub.jrxml";
		//由jrxml檔案編譯後生產jasper檔案的路徑
		String mainjasperPath = request.getServletContext().getRealPath("/")+"/jasper/DemoReport6_main.jasper";
		String subjasperPath = request.getServletContext().getRealPath("/")+"/jasper/DemoReport6_sub.jasper";
		
		try {
			//編譯jrxml生產jasper檔案
			JasperCompileManager.compileReportToFile(mainjrxmlPath, mainjasperPath);
			JasperCompileManager.compileReportToFile(subjrxmlPath, subjasperPath);
			
			parameters.put("title", "學生成績表");
			parameters.put("date", new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
			String SUBREPORT_DIR = request.getServletContext().getRealPath("/")+"/jasper/";
			parameters.put("SUBREPORT_DIR",SUBREPORT_DIR);
			
			JasperPrint jasperPrint = JasperFillManager.fillReport(mainjasperPath, parameters, new JRBeanCollectionDataSource(list));
			//生成html檔案(位置:D:/HTML/student.html)
			JasperExportManager.exportReportToHtmlFile(jasperPrint, "D:/HTML/student.html");
		} catch (JRException e) {
			e.printStackTrace();
		}
	}


8.3 啟動tomcat,訪問servlet,檢視html檔案








相關推薦

Jasperreports+jaspersoft studio學習教程- 報表Subreport(父子報表互相)

       有很多人都說Jasperreports不適合中國式複雜報表,實際上運用好父子報表可以解決大部分問題了。例如下面的表。每個學生的學科數目不固定,且每個學生後有相當於小計的平均分。有點複雜度的報表,可以使用子報表解決。 8.1 設計報表模板 8.1.1 

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

9.1 設計報表模板 9.1.1 使用Table元件新建模板(步驟參考教程七)如下: 9.1.2 模板自帶變數 $V{PAGE_NUMBER} :代表當前頁數(可以是頁碼也可以是頁數,通過TextField的計算時間的不同值來設定) $V{PAGE_COUNT

Jasperreports+jaspersoft studio學習教程- JDBC嚮導作為資料來源填充資料

4.1 在studio工具中可以直接連線資料庫,利用sql語句檢索。建立資料庫,並建表 本教程使用mysql5.5+SQLyog工具,若沒有安裝,請百度自行安裝,建立DemoReport資料庫,並將user_tab表,注入資料如下: 4.2 在studio工具中新建

Jasperreports+jaspersoft studio學習教程- JavaBean作為資料來源填充資料

在實際專案中,一般使用java物件作為資料來源的方式更多,這種方式會更加靈活多變。對於mvc結構更為契合。上面介紹了用JDBC資料來源時,用到了Fields物件。本篇主要是使用Fileds物件來匹配JavaBean物件。 5.1 在專案中新建user物件(新增get,

Jasperreports+jaspersoft studio學習教程- 解決列印pdf中文不顯示問題

中文不顯示是一個常見問題。解決方法在網上也是五花八門。試過幾次,親測有效為介紹的這種: 中文不顯示問題主要是jasperreports提供的font包不能為中文格式提供支援,所以我們需要自定義一個font包,用於支援。 3.1 在studio中新增中文字型 3.1

Jasperreports+jaspersoft studio學習教程十一- JasperReportUtils

整理了一下用的Utils,更新一下哈! 1、DocType /** * 定義了報表輸出型別,固定了可輸出型別 * * @author * */ public enum DocType { PDF, HTML, XLS,XLSX, XML, RTF, CSV, TXT, D

python基礎教程第三版)學習筆記

第八章異常 異常事件可能是錯誤(如試圖除以零),也可能是通常不會發生的事情。為處理這些異常事件,可在每個可能發生這些事件的地方都使用異常處理機制。 8.1 異常是什麼 Python使用異常物件來表示異常狀態,並在遇到錯誤時引發異常。異常物件未被處理(或捕獲)時,程式將終止並顯示一條錯誤訊息(trac

基於PyTorch的深度學習入門教程——影象風格遷移

前言 本文介紹怎樣執行Neural-Style演算法。Neural-Style或者叫做Neural-Transfer,將一個內容影象和一個風格影象作為輸入,返回一個按照所選擇的風格影象加工的內容影象。 原理是非常簡單的:我們定義兩個距離,一個用於內容(Dc)

Ceres Solver 官方教程學習筆記——數值微分法Numeric derivatives

利用analytic derivatives的另一個極端形式是 numeric derivatives,即數值微分法。數值微分法的關鍵是,目標函式f(x)f(x)的微分方程可以被寫成一個極限形式: Df(x)=limh→0f(x+h)−f(x)hDf(x

設計模式學習總結策略模式(Strategy)

isp 筆記本 override div ont 角色 write stat 通過   策略模式,主要是針對不同的情況采用不同的處理方式。如商場的打折季,不同種類的商品的打折幅度不一,所以針對不同的商品我們就要采用不同的計算方式即策略來進行處理。   一、示例展示:   以

機器學習筆記非線性變換

nbsp 線性 logs 等於 線性模型 images http 自己 空間 一、非線性問題 對於線性不可分的數據資料,用線性模型分類,Ein會很大,相應的Ein=Eout的情況下,Eout也會很大,導致模型表現不好,此時應用非線性模型進行分類,例如: 分類器模型是一個圓

匯編入門學習筆記 —— 轉移指令

無條件轉移 fse ear tom 內存 star space off 編譯器 瘋狂的暑假學習之 匯編入門學習筆記 (八)—— 轉移指令 參考: 《匯編語言》 王爽 第9章 能夠改動ip或者同一時候改動cs和ip的指令統稱

微信小程序開發教程視圖層——.wxml詳解

span hid 處理 路徑 strong 一般來說 emp 條件 頁面數據   框架的視圖層由WXMKL(WeiXin Markup language)與WXSS(WeiXin Style Sheet)編寫,由組件進行展示。   對於微信小程序而言,視圖層就是所有.wxm

微信公眾平臺開發教程Session處理

class 如果 obj returns name ref car opera 信用 在微信窗口,輸入的信息有限,我們需要將一些信息分多次請求。 比如:在進行用戶綁定時,我們需要輸入用戶的相關信息,比如:用戶名、密碼,或者姓名、電話號碼,服務端驗證通過,即可將系統用戶與微信

Nhibernate學習教程2-- 第一個NHibernate程序

collect 單元測試框架 文件映射 deb color rtu etc erb session管理 NHibernate之旅(2):第一個NHibernate程序 本節內容 開始使用NHibernate 1.獲取NHibernate 2.建立數據庫表 3.創建C#類庫

python基礎教程

處理 true spa 查看 對象 信息 世界 基礎教程 設計 創建自已的對象(類)是python非常核心的概念,事實上,python被稱為面向對象語言,本章會介紹如何創建對象。以及面向對象的概念:繼承、封裝、多態。 多態: 可對不同類的對象使用同樣的操作。 封裝:對

流暢的python和cookbook學習筆記

不可變 pri 列表 改變 如果 book 影響 color print 1.函數的默認參數必須不可變   如果函數的默認參數為可變的對象,那麽默認參數在函數外被修改也會影響到函數本身的。 >>> def spam(a, b=None): # b要為不

Python學習筆記

base 函數式編程 輸出 必須 返回 叠代 use map 作用 一、變量可以指向一個函數   a = abs 二、通過調用指向函數的變量可以執行該函數   a = abs  a(-10) 三、指向函數的變量可以作為參數傳遞給一個函數   def add(x,y,f): 

EF學習筆記:更新關聯數據

tro rop es2017 net sage red ida string entity 學習筆記主目錄鏈接:ASP.NET MVC5 及 EF6 學習筆記 - (目錄整理) 上一篇鏈接:EF學習筆記(七):讀取關聯數據 本篇原文鏈接:Updating Related D

2017.9.22 學習總結

內置對象 訪問 style 歷史 停止 ati 取消 asc 執行指定 1.javascript的對象   javascript中設有內置對象,常用的內置對象有String\Data\和瀏覽器   的文檔對象(window、navigator、screen、history、