`
Disney2002
  • 浏览: 52930 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JasperReport 个人使用的一些经验

阅读更多
本文主要介绍下我在工作中使用JasperReport的一些经验,顺便给自己也做个笔记。

关于JasperReport的介绍就不谈了,网上多了去了,不了解的朋友可以去Google下先,这里主要分享经验和技巧,避免一些网友走弯路。

1、关于iReport的使用
JasperReport的使用简单归结就是报表模板+数据填充。

模板是通过一个后缀名为jrxml的XML文件,编译后生成的以.jasper为后缀的JasperReport模板。模板设计目前基本上都是使用其官方的可视化工具iReport来做的,iReport是基于Netbeans的一个插件,通过它可以可视化的编辑JasperReport模板。

数据填充一般分二种方式,一种方式是通过JDBC连接提供数据源,一种就是通过javaBean的集合提供数据源,可以根据自己的情况来选择。

iReport插件安装后,需要设置你在iReport里面使用的类的类路径,这个好多朋友在开始的时候找不到,截个图可以看看:



一般都是Add Folder,如果是已经打成Jar的可以直接选择Add Jar。

2、报表结尾的署名位置
一般报表最后都会有一行关于XXX填写啊,日期啊之类的用于确认或者一些辅助数据。
大家可能会直接放在Page Footer里面,这样打印出来的结果是这一行肯定会在页面底部,不能随着内容的长短来调整位置,哪怕你报表只有一行。这里分享个经验,你可以放到Summary里面,这样就可以根据Detail的长短来显示了。

3、子报表
关于子报表估计是好多网友关心的问题,因为大部分时间需要用到,可是关于这类的教程又太少了,这里我就介绍下如何使用子报表,内容参考了网上的一些资料.
准备工作:
  1.主对象,就是报表要打印的对象,里面含一个List,这个需要用子报表来打印.
import java.util.List;

public class MainVO {

    private String title;
    private List<SubVO> subList;

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public List<SubVO> getSubList() {
        return subList;
    }

    public void setSubList(List<SubVO> subList) {
        this.subList = subList;
    }
}


  2.子报表对象
public class SubVO {

    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


  3.子报表数据集,测试数据
import java.util.ArrayList;
import java.util.List;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class SubFactory {

    public static JRDataSource createDatasource() {
        List<SubVO> list2 = new ArrayList<SubVO>();

        SubVO svo1 = new SubVO();
        svo1.setName("单位1");
        SubVO svo2 = new SubVO();
        svo2.setName("单位2");
        SubVO svo3 = new SubVO();
        svo3.setName("单位3");
        SubVO svo4 = new SubVO();
        svo4.setName("单位4");
        list2.add(svo1);
        list2.add(svo2);
        list2.add(svo3);
        return new JRBeanCollectionDataSource(list2);
    }
}


  4.主报表数据集,测试数据
import java.util.ArrayList;
import java.util.List;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRAbstractBeanDataSourceProvider;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

/**
 *
 * @author xiaoquan
 */
public class TestSubReport extends JRAbstractBeanDataSourceProvider {

    public TestSubReport() {
        super(MainVO.class);
    }

    public JRDataSource create(JasperReport arg0) throws JRException {
        List<MainVO> mainList = new ArrayList<MainVO>();
        List<SubVO> list1 = new ArrayList<SubVO>();
        List<SubVO> list2 = new ArrayList<SubVO>();

        SubVO svo1 = new SubVO();
        svo1.setName("单位1");
        SubVO svo2 = new SubVO();
        svo2.setName("单位2");
        SubVO svo3 = new SubVO();
        svo3.setName("单位3");
        SubVO svo4 = new SubVO();
        svo4.setName("单位4");

        list1.add(svo4);
        list1.add(svo3);

        list2.add(svo1);
        list2.add(svo2);
        list2.add(svo3);

        MainVO vo1 = new MainVO();
        vo1.setTitle("场1");
        vo1.setSubList(list1);

        MainVO vo2 = new MainVO();
        vo2.setTitle("场2");
        vo2.setSubList(list2);

        mainList.add(vo2);
        mainList.add(vo1);

        return new JRBeanCollectionDataSource(mainList);
    }

    public void dispose(JRDataSource arg0) throws JRException {
        
    }
}


  5.准备好上述数据后,开始在iReport上操作了,绑定测试数据源到iReport.

MainVO的测试数据源:


SubVO的测试数据源:


  6.准备好数据源后开始设计JasperReport模板



模板和对象绑定,在MainVOReport(上图)的空白处点一下,然后点击数据库那个小图标:



会打开下面界面,选择DataSource Provider:



点击Get Field from datasource, 会获取到MainVo的属性,如上图下半部分所示.

  7.子报表关联
我们需要将MainVo中的List属性值显示在子报表里面,就需要设置一个变量来传值了.

  1)在MainVOReport界面,添加一个Variables, 命名为other,设置如下图所示:



  2)然后点击MainVOReport界面上的子报表,在右边的属性设置如下图:



  3)创建Scriptlet,用来连接设置变量值
import java.util.List;
import net.sf.jasperreports.engine.JRAbstractScriptlet;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRScriptletException;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

public class MainReportScriptlet extends JRAbstractScriptlet {
    @Override
    public void afterDetailEval() throws JRScriptletException {
       System.out.println("afterDetailEval...");
       List subList = (List)getFieldValue("subList");
       JRDataSource jr = new JRBeanCollectionDataSource(subList);
       /**
        *该值是在父报表中定义的一个变量Variables,
        *类型为net.sf.jasperreports.engine.JRDataSource
         *(就是上图的变量设置)
        **/
         setVariableValue("other", jr);
    }

    @Override
    public void beforeReportInit() throws JRScriptletException {
    }

    @Override
    public void afterReportInit() throws JRScriptletException {
    }

    @Override
    public void beforePageInit() throws JRScriptletException {
    }

    @Override
    public void afterPageInit() throws JRScriptletException {
    }

    @Override
    public void beforeColumnInit() throws JRScriptletException {
    }

    @Override
    public void afterColumnInit() throws JRScriptletException {
    }

    @Override
    public void beforeGroupInit(String arg0) throws JRScriptletException {
    }

    @Override
    public void afterGroupInit(String arg0) throws JRScriptletException {
    }

    @Override
    public void beforeDetailEval() throws JRScriptletException {
    }
}


上面三步就是创建子报表的重要三步,我刚开始也是这里没摸索到.

  8.子报表设计
    子报表的设计和主报表是一样的,因为它在这里是一个单独的报表,可以用自己的数据源来测试,也就是我们上面创建的SubFactory
    子报表对象绑定,由于主报表和子报表使用的数据源不同,对象属性绑定方式稍有不同,如下图所示:



  9.编译报表
    不同的报表选择不同的数据源来编译.
    选择相对应的数据源后,点击报表工具栏上的preview来预览,预览时会先编译,然后填充数据,有问题的话这个时候会暴露出来,根据错误提示自己再查找查找原因吧.
    子报表变动要先编译子报表,然后编译主报表.



好了,目前就先分享到这里, 上面自己的分享如果有不对之处,欢迎大家提出,并分享.
顺便分享几个链接,对于学习JasperReport比较有帮助,这边文章的部分内容也参考了下面的链接:
1、ireport + jasperreport(上中下)
    http://wangyaodi.iteye.com/blog/214496
    http://wangyaodi.iteye.com/blog/214500
    http://wangyaodi.iteye.com/blog/214504

2、利用复合的javabean构造基于jasperreports的子报表 (子报表内容基本上参考自这里)
    http://blog.csdn.net/lemonfamily/archive/2007/04/05/1553291.aspx






  • 大小: 71.7 KB
  • 大小: 26.9 KB
  • 大小: 28.8 KB
  • 大小: 7.7 KB
  • 大小: 2.9 KB
  • 大小: 21.7 KB
  • 大小: 14.5 KB
  • 大小: 19.2 KB
  • 大小: 23.5 KB
1
1
分享到:
评论
2 楼 Disney2002 2009-07-21  
Disney2002 写道
现在遇到一个问题,如果报表模板列不定怎么来打印呢?

比如有个表格是动态生成的,列不定,这样的话报表模板如何来设计?

貌似对于这类情况,只能手动通过编程来实现, JasperDesign这个类就是做这个事情的.
看看这个例子:
http://sunsy.iteye.com/blog/98140

正在研究ing
1 楼 Disney2002 2009-07-20  
现在遇到一个问题,如果报表模板列不定怎么来打印呢?

比如有个表格是动态生成的,列不定,这样的话报表模板如何来设计?

相关推荐

Global site tag (gtag.js) - Google Analytics