六、使用JavaBean作数据源生成JasperReport报表
1、建测试数据表。这里就不重新建表了,使用上面所建的表
2、编写用作数据源的JavaBean。
jasperReport对JavaBean没什么特殊要求,只要有getter和setter方法的JavaBean就可以,但最好就是不带业务逻辑的POJO bean.这里,为了能让IReport可以预览带数据的报表,需要在JavaBean里面增加一个方法来产生测试数据。我写的Bean如下:
public class Product {
private String id;
private String name;
private float price_unit;
private float list_price;
private String brand;
private String model;
private float size_long;
private float size_width;
private float size_height;
private String SPEC;
private String UNIT;
private String manufactory;
private String reseller;
private String producing_area;
private String description;
private String update_time;
private String picture_small;
private String CENTER_PICTURE;
private String picture_big;
private String note;
private String INTRO;
private String search_key;
private String TEMPLATE_ID;
private String status;
private String create_time;
private String MAIN_CATEGORY;
private String PRODUCT_NO;
private int sort_index;
private String corpid;
private String ptciure_pop;
private String LINKURL;
private String EXT_FIELD1;
private String EXT_FIELD2;
private String displayId;
private int quantity;
private int quantity_warn;
private String spec_name1;
private String spec_name2;
private String spec_value1;
private String spec_value2;
/**
* 构造测试数据
* @return Product
*/
public static Product getSampleData(){
Product p = new Product();
p.setBrand("天知道");
p.setCENTER_PICTURE("CENTER_PICTURE");
p.setCorpid("山寨厂");
p.setCreate_time("2008-01-01");
p.setDescription("山寨手机");
p.setDisplayId("DisplayId");
p.setEXT_FIELD1("没有");
p.setEXT_FIELD2("没有");
p.setId("00001");
p.setINTRO("山寨高仿手机");
p.setLINKURL("http://www.baidu.com/123.html");
p.setList_price(2008.0f);
p.setMAIN_CATEGORY("数码产品");
p.setManufactory("厦门地下工厂");
p.setModel("XO2");
p.setName("高仿多普达S1手机");
p.setNote("没有备注");
p.setPicture_big("/images/123_b.jpg");
p.setPicture_small("/images/123_s.jpg");
p.setPrice_unit(1500.0f);
p.setProducing_area("华南");
p.setPRODUCT_NO("4567");
p.setPtciure_pop("Ptciure_pop");
p.setQuantity(10000);
p.setQuantity_warn(100);
p.setReseller("Reseller");
p.setSearch_key("没有关键字");
p.setSize_height(2);
p.setSize_long(30);
p.setSize_width(10);
p.setSort_index(1);
p.setSPEC("SPEC");
p.setSpec_name1("Spec_name1");
p.setSpec_name2("Spec_name2");
p.setSpec_value1("Spec_value1");
p.setSpec_value2("Spec_value2");
p.setStatus("正常");
p.setTEMPLATE_ID("1234567.temp");
p.setUNIT("台");
p.setUpdate_time("2008-10-01");
return p;
}
/**
* 构造测试数据列表
* @return List
*/
public static List createBeanCollection() {
ArrayList colList = new ArrayList();
Product report = Product.getSampleData();
colList.add(report);
return colList;
}
...
//getter和setter方法省略
}
3、修改IReport的配置
修改IReport的配置,把Product包含到ClassPath中
4、建一个新的数据源连接:
为了使IReport能识别Product类并作为数据源使用,需要配置一个JavaBean数据连接,并指向Product类:
5、创建报表
a、从菜单“档案-->开启新档”点开,在弹出框中输入报表名称,然后OK:
b、从菜单“Data→报表查询”点开查询设计器,在查询设计器点“JavaBean Data Source”标签:
在Class name框输入我们Product类全路径,然后点“Read attributes”,把从Product类中读取出来的属性全部选中,然后点“Add Selected Field(s)”,然后OK:
c、给报表添加字段。从工具栏上选择“report fields, variables and parameters”那个按钮(别说找不到),点开。把Fields里面的字段一个个拖到报表设计区。
d、报表设计过程(这里省略xxx字),设计后效果如下:
e、从菜单“建立→执行报表(使用动态连接)”点开,预览一下我们的杰作,预览的效果是这样的:
f、到这里,基于JavaBean报表基本完成了,接下来,我们把生成的XXX.jrxml和XXX.jasper放到我们的应用中去,代码如下:
package com.javaeye.demo.test;
import com.lowagie.text.pdf.PdfWriter;
import net.sf.jasperreports.engine.JRException;
import java.util.Map;
import java.util.HashMap;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.JasperRunManager;
import java.net.URL;
import java.io.File;
import net.sf.jasperreports.engine.export.JRPdfExporterParameter;
import net.sf.jasperreports.engine.util.JRLoader;
import java.sql.Connection;
import java.util.List;
import java.util.ArrayList;
import java.sql.Statement;
import java.sql.SQLException;
import java.sql.ResultSet;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import java.io.IOException;
import java.io.FileOutputStream;
import java.io.FileNotFoundException;
/**
* <p>Title: ShineTax纳税申报辅助系统</p>
* <p>Description: ShineTax纳税申报辅助系统</p>
* <p>Copyright: Copyright (c) 2008</p>
* <p>Company: WSGroup</p>
*
* @author ShengYoufu(wdmsyf@yahoo.com)
* @version 1.0
*/
public class JasperReportBeanDSTest extends JasperReportJDBCTest {
/**
* 从数据库取数
* @return List
*/
protected List getReportData(){
ArrayList dataList = new ArrayList();
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try{
conn = this.getConnection();
stmt = conn.createStatement();
rs = stmt.executeQuery("select * from product");
while(rs.next()){
Product p = new Product();
p.setBrand( rs.getString("brand") );
p.setCENTER_PICTURE( rs.getString("CENTER_PICTURE") );
p.setCorpid( rs.getString("corpid"));
p.setCreate_time( rs.getString("create_time") );
p.setDescription( rs.getString("Description"));
p.setDisplayId( rs.getString("DisplayId") );
p.setEXT_FIELD1( rs.getString( "EXT_FIELD1" ) );
p.setEXT_FIELD2( rs.getString("EXT_FIELD2"));
p.setId( rs.getString("id"));
p.setINTRO( rs.getString("INTRO"));
p.setLINKURL( rs.getString("LINKURL") );
p.setList_price( rs.getFloat("List_price") );
p.setMAIN_CATEGORY( rs.getString("MAIN_CATEGORY") );
p.setManufactory( rs.getString("Manufactory") );
p.setModel( rs.getString("Model") );
p.setName( rs.getString("Name") );
p.setNote( rs.getString("Note") );
p.setPicture_big( rs.getString("Picture_big") );
p.setPicture_small( rs.getString("Picture_small") );
p.setPrice_unit( rs.getFloat("Price_unit") );
p.setProducing_area( rs.getString("Producing_area") );
p.setPRODUCT_NO( rs.getString("PRODUCT_NO") );
p.setPtciure_pop( rs.getString("Ptciure_pop"));
p.setQuantity(rs.getInt("Quantity"));
p.setQuantity_warn( rs.getInt("Quantity_warn") );
p.setReseller( rs.getString("Reseller") );
p.setSearch_key( rs.getString("Search_key") );
p.setSize_height( rs.getFloat("Size_height"));
p.setSize_long( rs.getFloat("Size_long") );
p.setSize_width( rs.getFloat("Size_width") );
p.setSort_index( rs.getInt("Sort_index") );
p.setSPEC( rs.getString("SPEC") );
p.setSpec_name1( rs.getString("Spec_name1") );
p.setSpec_name2( rs.getString("Spec_name2") );
p.setSpec_value1( rs.getString("Spec_value1") );
p.setSpec_value2( rs.getString("Spec_value2") );
p.setStatus( rs.getString("Status") );
p.setTEMPLATE_ID( rs.getString("TEMPLATE_ID") );
p.setUNIT( rs.getString("UNIT") );
p.setUpdate_time( rs.getString("Update_time") );
dataList.add( p );
}
}catch(SQLException ex){
ex.printStackTrace();
}finally{
try{ if(rs!=null) rs.close(); } catch(SQLException ex1){ex1.printStackTrace();}
try{ if(stmt!=null) stmt.close(); } catch(SQLException ex1){ex1.printStackTrace();}
try{ if(conn!=null) conn.close(); } catch(SQLException ex1){ex1.printStackTrace();}
}
return dataList;
}
/**
* 生成报表数据
* @return byte[]
*/
protected byte[] genReportBean() {
URL url = this.getClass().getResource("/reports/product_javabean.jasper");
System.out.println("测试报表模板: " + (url == null ? "未取到" : url.getPath()));
if (url == null || url.getPath() == null) {
throw new RuntimeException("Generate PDF report failed, the report templet file not found.");
}
String path = url.getFile();
path = path.substring(0, path.lastIndexOf("/"));
File reportFile = new File(url.getFile());
if (!reportFile.exists()) {
throw new RuntimeException("Generate PDF report failed, the report templet file not exist.");
}
//取报表数据
List dataList = this.getReportData();
//根据数据Bean生成jasperReport的数据源
JRDataSource jrds = new JRBeanCollectionDataSource( dataList );
//设置报表参数
Map parameters = new HashMap();
parameters.put(JRPdfExporterParameter.IS_ENCRYPTED, Boolean.TRUE);
parameters.put(JRPdfExporterParameter.IS_128_BIT_KEY, Boolean.TRUE);
parameters.put(JRPdfExporterParameter.USER_PASSWORD, "");
parameters.put(JRPdfExporterParameter.OWNER_PASSWORD, "www.xm-l-tax.gov.cn");
parameters.put(JRPdfExporterParameter.METADATA_TITLE, "XXX商场货物库存日报表");
parameters.put(JRPdfExporterParameter.METADATA_SUBJECT, "XXX商场");
parameters.put(JRPdfExporterParameter.METADATA_KEYWORDS, "商场,货物,库存,日报表");
parameters.put(JRPdfExporterParameter.METADATA_AUTHOR, "wdmsyf@yahoo.com");
parameters.put(JRPdfExporterParameter.METADATA_CREATOR, "wdmsyf@yahoo.com");
parameters.put(JRPdfExporterParameter.PERMISSIONS, PdfWriter.AllowFillIn);
byte[] reportData = null;
try {
//生成PDF的byte数据
reportData = JasperRunManager.runReportToPdf(reportFile.getPath(), parameters, jrds);
} catch (JRException ex) {
throw new RuntimeException("Generate PDF report failed.", ex);
}
return reportData;
}
/**
* 生成报表并保存到硬盘
*/
public void genAndSaveReport(){
byte[] reportData = this.genReportBean( );
saveReport(reportData, "c:/货物库存日报表_javabean.pdf");
}
public static void main(String[] args) {
JasperReportBeanDSTest test = new JasperReportBeanDSTest();
test.genAndSaveReport();
}
}
执行这段代码,生成的PDF 如下:
6、
三、总结:
上面我们已经把JasperReport根据JDBC和JavaBean生成报表的过程走马观花了一遍,我个人认为这也应该是我们应用中最常用的两种数据提供形式,只要掌握这两种方式,应付应用中6成以上(保守估计啊)报表应该没问题了,呵呵。当然,上面讲的这些只是JasperReport的皮毛而已,想要知道更多功能,你有两条路可以选:一是自己学习;二是等下次讲座。至于下次讲座安排在什么时候?短则三五周以后,长则三五十年也说不定,你耐心点等着吧。