Struts2+JasperReport结合iReport报表开发

转载网址 :http://www.sunchis.com/html/java/javareport/2010/0313/67.html

 

一、准备

下载iReport3.7.1、JasperReport3.7.1、Struts2.1.8及其他需要的包,需导入包如下图:

JasperReport3.7.1下载:http://sourceforge.net/projects/jasperreports/files/jasperreports

iReport3.7.1下载:http://sourceforge.net/projects/ireport/files/iReport

Struts2.1.8下载:http://struts.apache.org/download.cgi

二、整合Struts2+JasperReport3

1. 新建以下三个pojo类:

Address
 
 
  1. package com.xy.report.pojo;  
  2.  
  3. public class Address {  
  4.     private String city;  
  5.     private String zipcode;  
  6.     public String getCity() {  
  7.         return city;  
  8.     }  
  9.     public void setCity(String city) {  
  10.         this.city = city;  
  11.     }  
  12.     public String getZipcode() {  
  13.         return zipcode;  
  14.     }  
  15.     public void setZipcode(String zipcode) {  
  16.         this.zipcode = zipcode;  
  17.     }  
Company
 
 
  1. package com.xy.report.pojo;  
  2.  
  3. import java.util.HashSet;  
  4. import java.util.Set;  
  5.  
  6. public class Company implements Comparable<Company>{  
  7.     private String name;  
  8.     private Address address;  
  9.     private Set<Staff> staffs = new HashSet<Staff>();  
  10.       
  11.     @Override 
  12.     public int compareTo(Company o) {  
  13.         return o.getName().compareTo(this.getName());  
  14.     }  
  15.  
  16.     public String getName() {  
  17.         return name;  
  18.     }  
  19.     public void setName(String name) {  
  20.         this.name = name;  
  21.     }  
  22.     public Address getAddress() {  
  23.         return address;  
  24.     }  
  25.     public void setAddress(Address address) {  
  26.         this.address = address;  
  27.     }  
  28.     public Set<Staff> getStaffs() {  
  29.         return staffs;  
  30.     }  
  31.     public void setStaffs(Set<Staff> staffs) {  
  32.         this.staffs = staffs;  
  33.     }  
  34.  

Company中compareTo方法用于在报表中排序。

Staff
 
 
  1. package com.xy.report.pojo;  
  2.  
  3. public class Staff {  
  4.     private String name;  
  5.     private Company company;  
  6.  
  7.     public String getName() {  
  8.         return name;  
  9.     }  
  10.  
  11.     public void setName(String name) {  
  12.         this.name = name;  
  13.     }  
  14.  
  15.     public Company getCompany() {  
  16.         return company;  
  17.     }  
  18.  
  19.     public void setCompany(Company company) {  
  20.         this.company = company;  
  21.     }  
  22.       
  23.       

以上Address是Company的组件,Company与Staff是一对多关系。

2. 新建Action

 
 
  1. package com.xy.report.action;  
  2.  
  3. import java.util.ArrayList;  
  4. import java.util.HashMap;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.  
  8. import com.opensymphony.xwork2.ActionSupport;  
  9. import com.xy.report.pojo.Address;  
  10. import com.xy.report.pojo.Company;  
  11. import com.xy.report.pojo.Staff;  
  12.  
  13. public class DemoAction extends ActionSupport{  
  14.  
  15.     private static final long serialVersionUID = -5460323122712890562L;  
  16.       
  17.     private List<Staff> list;  
  18.     private Map<String,Object> map;  
  19.       
  20.     @Override 
  21.     public String execute(){  
  22.         list = getData();  
  23.         map = getParameter();  
  24.           
  25.         return SUCCESS;  
  26.     }  
  27.       
  28.     private List<Staff> getData(){  
  29.         Address address = new Address();  
  30.         address.setCity("上海");  
  31.         address.setZipcode("201400");  
  32.  
  33.         Company company1 = new Company();  
  34.         company1.setName("飞利浦");  
  35.         company1.setAddress(address);  
  36.         Company company2 = new Company();  
  37.         company2.setName("谷歌");  
  38.         company2.setAddress(address);  
  39.  
  40.         Staff staff1 = new Staff();  
  41.         staff1.setName("张三");  
  42.         staff1.setCompany(company1);  
  43.         Staff staff2 = new Staff();  
  44.         staff2.setName("李四");  
  45.         staff2.setCompany(company2);  
  46.         Staff staff3 = new Staff();  
  47.         staff3.setName("王五");  
  48.         staff3.setCompany(company1);  
  49.           
  50.         List<Staff> list = new ArrayList<Staff>();  
  51.         list.add(staff1);  
  52.         list.add(staff2);  
  53.         list.add(staff3);  
  54.           
  55.         return list;  
  56.     }  
  57.       
  58.     private Map<String,Object> getParameter(){  
  59.         Map<String,Object> map = new HashMap<String,Object>();  
  60.         map.put("date""2010-03-12");  
  61.         return map;  
  62.     }  
  63.       
  64.     // getter, setter  
  65.     public List<Staff> getList() {  
  66.         return list;  
  67.     }  
  68.     public void setList(List<Staff> list) {  
  69.         this.list = list;  
  70.     }  
  71.     public Map<String, Object> getMap() {  
  72.         return map;  
  73.     }  
  74.     public void setMap(Map<String, Object> map) {  
  75.         this.map = map;  
  76.     }  

以上list为提供给报表的数据源,map为提供给报表的参数,如日期范围等。struts.xml配置如下:

 
 
  1. <?xml version="1.0" encoding="UTF-8"?> 
  2. <!DOCTYPE struts PUBLIC "
  3. -//Apache Software Foundation//DTD Struts Configuration 2.0//EN" 
  4. "http://struts.apache.org/dtds/struts-2.0.dtd" > 
  5. <struts> 
  6.     <include file="struts-default.xml"></include> 
  7.       
  8.     <!-- 报表演示 --> 
  9.     <package name="default" namespace="/reports" extends="struts-default,jasperreports-default"> 
  10.         <action name="demoReport" class="com.xy.report.action.DemoAction"> 
  11.             <result name="success" type="jasper"> 
  12.                 <param name="location">/reports/demoReport.jasper</param> 
  13.                 <param name="dataSource">list</param> 
  14.                 <param name="format">PDF</param> 
  15.                 <param name="reportParameters">map</param> 
  16.             </result> 
  17.         </action> 
  18.     </package> 
  19. </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的值就行了。

    设计完的报表如下图:

    7. 编译报表

    点击工具栏上Preview右边榔头一样的东西,将报表编译成.jasper文件。

    8. 运行报表

    将编译好的demoReport.jasper文件复制到项目WebContent\reports目录下,启动容器,浏览器下查看报表如下:

    项目结构如下:

你可能感兴趣的:(jasperReport)