JasperReport 个人使用的一些经验

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

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

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

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

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

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

[img]/upload/attachment/126794/03b7d4d5-c9ad-38f5-9ce7-c64560264979.png[/img]

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

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

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

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;
}
}


[i]2.子报表对象[/i]

public class SubVO {

private String name;

public String getName() {
return name;
}

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


[i]3.子报表数据集,测试数据[/i]

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);
}
}


[i]4.主报表数据集,测试数据[/i]

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 {

}
}


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

MainVO的测试数据源:
[img]/upload/attachment/127019/4d0cbd12-222a-3919-a424-d905f7e3d37b.png[/img]

SubVO的测试数据源:
[img]/upload/attachment/127021/a6f9cd94-4d40-3b9f-ada1-22fa0b55d836.png[/img]

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

[img]/upload/attachment/127026/f970dd88-8500-380c-8ecf-6d05b816ee1b.png[/img]

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

[img]/upload/attachment/127030/d67ea149-df86-3138-b506-52db60f6ac7a.png[/img]

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

[img]/upload/attachment/127032/170af041-0ba3-3c52-8e8d-58afa18ad827.png[/img]

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

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

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

[img]/upload/attachment/127069/2f003d0f-5773-3747-b73f-516ada3dd744.png[/img]

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

[img]/upload/attachment/127071/07f39a1c-90bc-3a04-8810-2b848e67a6dd.png[/img]

[b]3)创建Scriptlet,用来连接设置变量值[/b]

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 {
}
}


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

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

[img]/upload/attachment/127076/159c23f2-75e0-3486-aa25-03ab74465d0f.png[/img]

[i]9.编译报表[/i]
不同的报表选择不同的数据源来编译.
选择相对应的数据源后,点击报表工具栏上的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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值