`

jasperReport 开源报表管窥(续二)

阅读更多

六、使用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的皮毛而已,想要知道更多功能,你有两条路可以选:一是自己学习;二是等下次讲座。至于下次讲座安排在什么时候?短则三五周以后,长则三五十年也说不定,你耐心点等着吧。

分享到:
评论

相关推荐

    jasperreport一个子报表的例子

    JasperReport是一个强大的Java报告库,它允许开发者创建复杂、美观的报表,广泛应用于企业级应用中。在JasperReport中,子报表是用于在主报表内部嵌套其他报表的一个功能,可以用来组织和展示更复杂的结构化数据。...

    使用JavaBean构造JasperReport子报表

    综上所述,要使用JavaBean构建JasperReport子报表,你需要理解JasperReport的工作原理,掌握JavaBean数据绑定,了解子报表的概念及其用法,同时确保项目中导入了所有必要的库文件。通过实践和参考相关教程,可以逐步...

    jasperreport 6.4.1报表动态列,以及生成导出html

    JasperReport是一款强大的开源报告生成库,主要用于设计和打印各种复杂的报表。在6.4.1版本中,它提供了丰富的功能,包括支持动态列的报表设计,这使得开发者可以根据数据的实际情况灵活调整列的数量和内容。这个...

    JasperReport动态报表归并行数据

    JasperReport是一款强大的开源报表工具,它允许开发者创建复杂、美观的报表,并且支持动态数据处理。在“JasperReport动态报表归并行数据”这个主题中,我们主要讨论如何利用JasperReport来处理和展示动态变化的数据...

    jasperReport测试项目(含报表设计文件).rar_jasperReport 设计报表_jasperreport_报表设

    JasperReport是一款强大的开源报表工具,它允许开发者创建复杂的数据报告并以多种格式输出,如HTML、JSP、PDF等。在本项目中,“jasperReport测试项目(含报表设计文件).rar”是一个压缩包,包含了一系列用于...

    JasperReport 水晶报表

    JasperReport是一款开源的报表工具,广泛应用于Java环境中,为开发者提供了设计、生成和展示复杂报表的功能。它以其灵活性、强大的数据处理能力和丰富的图表选项而备受赞誉。水晶报表(Crystal Reports)是另一款...

    JasperReport 中交叉报表指南

    JasperReport 中交叉报表指南 JasperReport 是一个功能强大且灵活的报表生成工具,它提供了许多功能来帮助开发者生成复杂的报表。在报表生成中,交叉报表是一种常用的报表类型,能够将数据按照行和列进行交叉处理,...

    springboot整合JasperReport实现报表功能

    而JasperReport是一款强大的开源报表工具,能够帮助开发者创建、设计和展示复杂的业务报告。将两者整合,可以让SpringBoot应用程序轻松地生成和展示各种类型的报表。 在SpringBoot中整合JasperReport,首先你需要在...

    JasperReport报表设计总结

    JasperReport是一款强大的Java报表工具,它允许开发者创建复杂、多格式的报表,并能与各种数据源集成。本文主要总结了JasperReport报表设计的关键点,包括报表格式定制、数据填充以及显示或打印。 首先,报表格式的...

    开源报表设计-JasperReport VS BIRT

    本文将重点讨论两个备受推崇的开源报表设计工具——JasperReport和BIRT,并通过深入比较它们的特点、功能以及适用场景,帮助你做出更适合项目的决策。 JasperReport是一款强大的Java报表库,它允许开发人员创建复杂...

    JasperReport动态生成报表

    JasperReport是一款强大的开源报表工具,主要用于生成各种复杂的静态和动态报表。它基于Java,可以很好地与Java应用程序、Web应用和企业级应用集成,提供丰富的报表设计和灵活的数据呈现方式。JasperReport的核心...

    JasperReport6.4.0报表设计

    JasperReport是一款强大的开源报表工具,广泛应用于Java应用程序中,提供灵活的报告设计和丰富的数据可视化功能。在JasperReport 6.4.0版本中,它继续提升了用户体验,增强了报表设计的灵活性和可扩展性。在这个版本...

    struts2+Ireport+Jasperreport实现报表导出

    JasperReport是一个开源的报表生成库,它可以读取由iReport设计的模板,结合业务数据生成各种格式的报表,如PDF、HTML、Excel等。JasperReport的强大在于它的灵活性,可以处理动态数据,支持数据分组、排序、过滤等...

    整合Struts2+JasperReport Web报表应用示例

    Struts2是一个强大的MVC(模型-视图-控制器)框架,用于构建结构清晰、可维护性高的Web应用程序,而JasperReport则是一个功能丰富的报告生成库,能够创建复杂的报表并支持多种输出格式,如HTML、PDF等。 在"整合...

    JasperReport通用报表代码

    JasperReport通用报表代码,其实说不上通用,不过可以当入门参考。

    JasperReport+iReport报表工具

    JasperReport是基于Java开发的开源报表工具,它允许开发者设计各种复杂的报表,包括但不限于表格、图表和复杂格式的文档。JasperReport使用XML格式的报表定义文件(.jrxml),开发者可以通过定义这些文件来创建静态...

Global site tag (gtag.js) - Google Analytics