一、準備
下載iReport3.7.1、JasperReport3.7.1、Struts2.1.8及其他需要的包,需導入包如下圖:
如需生成Excel的話,還需導入poi-3.5.jar包。
二、整合Struts2+JasperReport3
1. 新建以下三個pojo類:
Address
public class Address {
private String city;
private String zipcode;
public String getCity() {
return city;
}
public void setCity(String city) {
this .city = city;
}
public String getZipcode() {
return zipcode;
}
public void setZipcode(String zipcode) {
this .zipcode = zipcode;
}
}
Company
import java.util.HashSet;
import java.util.Set;
public class Company implements Comparable < Company > {
private String name;
private Address address;
private Set < Staff > staffs = new HashSet < Staff > ();
@Override
public int compareTo(Company o) {
return o.getName().compareTo( this .getName());
}
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this .address = address;
}
public Set < Staff > getStaffs() {
return staffs;
}
public void setStaffs(Set < Staff > staffs) {
this .staffs = staffs;
}
}
Company中compareTo方法用於在報表中排序。
Staff
public class Staff {
private String name;
private Company company;
public String getName() {
return name;
}
public void setName(String name) {
this .name = name;
}
public Company getCompany() {
return company;
}
public void setCompany(Company company) {
this .company = company;
}
}
以上Address是Company的組件,Company與Staff是一對多關係。
2. 新建Action
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.opensymphony.xwork2.ActionSupport;
import com.xy.report.pojo.Address;
import com.xy.report.pojo.Company;
import com.xy.report.pojo.Staff;
public class DemoAction extends ActionSupport{
private static final long serialVersionUID = - 5460323122712890562L ;
private List < Staff > list;
private Map < String,Object > map;
@Override
public String execute(){
list = getData();
map = getParameter();
return SUCCESS;
}
private List < Staff > getData(){
Address address = new Address();
address.setCity( " 上海 " );
address.setZipcode( " 201400 " );
Company company1 = new Company();
company1.setName( " 飛利浦 " );
company1.setAddress(address);
Company company2 = new Company();
company2.setName( " 谷歌 " );
company2.setAddress(address);
Staff staff1 = new Staff();
staff1.setName( " 張三 " );
staff1.setCompany(company1);
Staff staff2 = new Staff();
staff2.setName( " 李四 " );
staff2.setCompany(company2);
Staff staff3 = new Staff();
staff3.setName( " 王五 " );
staff3.setCompany(company1);
List < Staff > list = new ArrayList < Staff > ();
list.add(staff1);
list.add(staff2);
list.add(staff3);
return list;
}
private Map < String,Object > getParameter(){
Map < String,Object > map = new HashMap < String,Object > ();
map.put( " date " , " 2010-03-12 " );
return map;
}
// getter, setter
public List < Staff > getList() {
return list;
}
public void setList(List < Staff > list) {
this .list = list;
}
public Map < String, Object > getMap() {
return map;
}
public void setMap(Map < String, Object > map) {
this .map = map;
}
}
以上list爲提供給報表的數據源,map爲提供給報表的參數,如日期範圍等。struts.xml配置如下:
<! DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd" >
< struts >
< include file ="struts-default.xml" ></ include >
<!-- 報表演示 -->
< package name ="default" namespace ="/reports" extends ="struts-default,jasperreports-default" >
< action name ="demoReport" class ="com.xy.report.action.DemoAction" >
< result name ="success" type ="jasper" >
< param name ="location" > /reports/demoReport.jasper </ param >
< param name ="dataSource" > list </ param >
< param name ="format" > PDF </ param >
< param name ="reportParameters" > map </ param >
</ result >
</ action >
</ package >
</ struts >
location - 提供利用iReport製作編譯好的報表文件。
dataSource - 數據源
format - 報表輸出格式
reportParameters - 報表參數
三、利用iReport開發報表
1. 新建數據源
打開iReport,點擊下圖像插頭一樣的Report Datasources,彈出對象框中New,選擇"JavaBeans set
datasource"後Next,輸入Name爲"demo"後Save,如下兩圖:
2. 增加類路徑
點擊“工具”“選項”,選擇classpath標籤頁,點擊Add
Folder,將項目類路徑加入,如下圖路徑爲:C:/Users/linli/Documents/workspace/JSReportDemo
/build/classes
3. 新建報表
點擊 create a new report
"Open this Template"後,輸入報表名這裏是demoReport後下一步,繼續完成。
4. 讀取bean屬性
點擊Preview字樣右邊的按鈕設置數據源,在彈出框中選擇"JavaBean Datasource"標籤頁,在Class
name中輸入類名,點擊"Read
attributes"會列出類中所有屬性。選中所需的屬性,這裏是company和name,點擊對話框中間的"Add selected
field(s)"增加到報表字段中。
報表將會按公司分組,所以需先按公司排序,當然這一步也可對struts2提供的數據源list進行處理,這裏使用了報表的Sort功能,所以
Company類必須實現Comparable接口。點擊"Sort options...",增加排序字段。
5. 增加分組
加擊左側Report Inspector中的demoReport,選擇"Add Report
Group",在彈出框中輸入分組名,選擇分組字段,如下圖。下一步至完成。
6. 設計報表
將左側Report
Inspector中Fields下剛加入的字段託到報表設計器中,取公司名寫成$F{company}.getName(),公司地址
爲$F{company}.getAddress().getCity(),員工姓名爲$F{name}。公司名和公司地址放在Group
Header裏,員工姓名放在Detail 1裏。
增加一個Parameters下的REPORT_PARAMETERS_MAP,他相當於一個map,取從struts2中設置的date值的方法
爲$P{REPORT_PARAMETERS_MAP}.get("date")。
組件面板中託"Page X of Y"顯示頁碼。
這裏有一些Title、Summary之類的,可能不需要,直接託到高度爲0了想要就託不出來了。這時在左側Report
Inspector中選中想要的項目,在右側"屬性"中輸入Bank height的值就行了。
設計完的報表如下圖:
ps: 設計報表時,如果字段要顯示中文,需修改該字段三個屬性的值,如下圖
7. 編譯報表
點擊工具欄上Preview右邊榔頭一樣的東西,將報表編譯成.jasper文件。
8. 運行報表
將編譯好的demoReport.jasper文件複製到項目WebContent/reports目錄下,啓動容器,瀏覽器下查看報表如下:
項目結構如下:
原文地址:http://www.blogjava.net/linli/archive/2010/03/12/315281.html