一、準(zhǔn)備
下載iReport3.7.1、JasperReport3.7.1、Struts2.1.8及其他需要的包,需導(dǎo)入包如下圖:

如需生成Excel的話,還需導(dǎo)入poi-3.5.jar包。
二、整合Struts2+JasperReport3
1. 新建以下三個pojo類:
Address
package com.xy.report.pojo;
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
package com.xy.report.pojo;
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方法用于在報(bào)表中排序。
Staff
package com.xy.report.pojo;
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是一對多關(guān)系。
2. 新建Action
package com.xy.report.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為提供給報(bào)表的數(shù)據(jù)源,map為提供給報(bào)表的參數(shù),如日期范圍等。struts.xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<!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>
<!-- 報(bào)表演示 -->
<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制作編譯好的報(bào)表文件。
dataSource - 數(shù)據(jù)源
format - 報(bào)表輸出格式
reportParameters - 報(bào)表參數(shù)
三、利用iReport開發(fā)報(bào)表
1. 新建數(shù)據(jù)源
打開iReport,點(diǎn)擊下圖像插頭一樣的Report Datasources,彈出對象框中New,選擇"JavaBeans set datasource"后Next,輸入Name為"demo"后Save,如下兩圖:
2. 增加類路徑
點(diǎn)擊“工具”“選項(xiàng)”,選擇classpath標(biāo)簽頁,點(diǎn)擊Add Folder,將項(xiàng)目類路徑加入,如下圖路徑為:C:\Users\linli\Documents\workspace\JSReportDemo\build\classes
3. 新建報(bào)表
點(diǎn)擊 create a new report

"Open this Template"后,輸入報(bào)表名這里是demoReport后下一步,繼續(xù)完成。
4. 讀取bean屬性
點(diǎn)擊Preview字樣右邊的按鈕設(shè)置數(shù)據(jù)源,在彈出框中選擇"JavaBean Datasource"標(biāo)簽頁,在Class name中輸入類名,點(diǎn)擊"Read attributes"會列出類中所有屬性。選中所需的屬性,這里是company和name,點(diǎn)擊對話框中間的"Add selected field(s)"增加到報(bào)表字段中。
報(bào)表將會按公司分組,所以需先按公司排序,當(dāng)然這一步也可對struts2提供的數(shù)據(jù)源list進(jìn)行處理,這里使用了報(bào)表的Sort功能,所以Company類必須實(shí)現(xiàn)Comparable接口。點(diǎn)擊"Sort options...",增加排序字段。
5. 增加分組
加擊左側(cè)Report Inspector中的demoReport,選擇"Add Report Group",在彈出框中輸入分組名,選擇分組字段,如下圖。下一步至完成。
6. 設(shè)計(jì)報(bào)表
將左側(cè)Report Inspector中Fields下剛加入的字段托到報(bào)表設(shè)計(jì)器中,取公司名寫成$F{company}.getName(),公司地址為$F{company}.getAddress().getCity(),員工姓名為$F{name}。公司名和公司地址放在Group Header里,員工姓名放在Detail 1里。
增加一個Parameters下的REPORT_PARAMETERS_MAP,他相當(dāng)于一個map,取從struts2中設(shè)置的date值的方法為$P{REPORT_PARAMETERS_MAP}.get("date")。
組件面板中托"Page X of Y"顯示頁碼。
這里有一些Title、Summary之類的,可能不需要,直接托到高度為0了想要就托不出來了。這時在左側(cè)Report Inspector中選中想要的項(xiàng)目,在右側(cè)"屬性"中輸入Bank height的值就行了。
設(shè)計(jì)完的報(bào)表如下圖:

ps: 設(shè)計(jì)報(bào)表時,如果字段要顯示中文,需修改該字段三個屬性的值,如下圖
7. 編譯報(bào)表
點(diǎn)擊工具欄上Preview右邊榔頭一樣的東西,將報(bào)表編譯成.jasper文件。
8. 運(yùn)行報(bào)表
將編譯好的demoReport.jasper文件復(fù)制到項(xiàng)目WebContent\reports目錄下,啟動容器,瀏覽器下查看報(bào)表如下:
項(xiàng)目結(jié)構(gòu)如下: