- 浏览: 191327 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (183)
- struts1 (2)
- android (1)
- 工作总结 (15)
- java (23)
- 信息拓展 (10)
- linux (1)
- html5 (10)
- js基础 (9)
- 系统设计 (2)
- css dhtml (7)
- oracle sqlplus plsql (3)
- div+css (1)
- 面试试题 (1)
- java.ibatis (3)
- 项目开发 (2)
- oracle (10)
- eclipse (1)
- 自强之道 (1)
- velocity (1)
- 常用办公软件EXCEL WORD PPT (1)
- ORA-02298: 无法验证 (PNET.POST_CLOB_FK) - 未找到父项关键字 (1)
- ligerui (1)
- 业务系统 (0)
《jasperreport 自定义javaBean数据源》
一:说明:
1.目前公司要做一类报表,统计要求显示从1月份到12月份的所有数据。且每个月份的数据列头都是一样的。见图:
2.由于用户运行环境要求,我们的报表数据源只能采用javabean的方式。
3.报表模块设计。
由于我们使用ireport设计报表模板,所以报表的列头,是不能通过循环生成的(即循环从1月到12月的列头),只能通过画出1月到12月的列头。见图:
二:实现生成报表:
1.普通的做法是。定义一个javaben类,包含从1月到12月份的所有字段。eg:
public class RepProjectStockModeSumReport extends BaseObject implements java.io.Serializable {
private String stockMode; //采购模式
private Double stockNumber1; //数量
private Double paStockPrice1; //平安采购价格
private Double marketPrice1; //市场价格
private Double marketSaveMoney1; //节约金额
private Double marketSaveMoneyPer1; //节约比例
private Double stockNumber2; //
private Double paStockPrice2; //
private Double marketPrice2; //
private Double marketSaveMoney2; //
private Double marketSaveMoneyPer2; //
}
每一行就是一个model记录。
这个是比较常用,比较简单的做法,也可以说是最稳定的做法。一般情况下,我们应该用它,除非你是跟我一样,不着实际的人。
2.我的做法:
public class RepProjectStockModeSumReport extends BaseObject implements java.io.Serializable {
private String stockMode; //采购模式
private Double stockNumber; //数量
private Double paStockPrice; //平安采购价格
private Double marketPrice; //市场价格
private Double marketSaveMoney; //节约金额
private Double marketSaveMoneyPer; //节约比例
}
即只列出一月份的属性,每个实体代表每个月份下的一行数据。
及一行下存在多条model数据。
三:自定义javabean数据源:
自定义javabean数据源很简单,只需要继承extends JRAbstractBeanDataSource就行了,同时实现next()和getFieldValue方法。
通过在自定义的javabean数据源中,指定获取当前显示数据的规则,从而决定当前显示那一条model数据。
eg:
public class PaAnCustomJRdataSource extends JRAbstractBeanDataSource {
private Collection<ItemStatReport> data;
private Object currentBean;
private Iterator<ItemStatReport> iterator;
private List<ItemStatReport> allData;
private int index = -1;
public PaAnCustomJRdataSource(Collection<ItemStatReport> collection) {
super(true);
if (collection.size() > 0) {
this.allData = (List<ItemStatReport>) collection;
List<ItemStatReport> list = (List<ItemStatReport>) collection;
Collections.sort(list, new Comparator<ItemStatReport>() {
public int compare(ItemStatReport o1, ItemStatReport o2) {
return o1.getSeqNumber() - o2.getSeqNumber();
}
});
List<ItemStatReport> dataList = new ArrayList<ItemStatReport>();
ItemStatReport itmesr = list.get(0);
int seqNumber = itmesr.getSeqNumber();
for (ItemStatReport isr : allData) {
if (isr.getSeqNumber() == seqNumber) {
dataList.add(isr);
} else {
break;
}
}
this.data = dataList;
this.iterator = data.iterator();
}
}
public boolean next() {
index++;
boolean hasNext = false;
if (this.iterator != null) {
hasNext = this.iterator.hasNext();
if (hasNext) {
this.currentBean = this.iterator.next();
}
}
return hasNext;
}
public Object getFieldValue(JRField field) throws JRException {
Object value = null;
String fieldName = field.getName();
String[] arr = fieldName.split("_");
if (arr.length > 1) {
int seqNumber = Integer.parseInt(arr[1]);
int dataLength = this.data.size();
int inteNumber = (seqNumber * dataLength) + this.index;
ItemStatReport positionObj = this.allData.get(inteNumber);
ItemStatReport currentObj = (ItemStatReport) currentBean;
if (currentObj.getCompareCol().intValue() == positionObj.getCompareCol().intValue()) {
value = getFieldValue(positionObj, field);
} else {
throw new RuntimeException("no found target Object !");
}
} else {
value = getFieldValue(currentBean, field);
}
return value;
}
}
public class PaAnCustomOfTwolJRdataSource extends JRAbstractBeanDataSource {
private Collection<ItemStatReport> data;
private Object currentBean;
private Iterator<ItemStatReport> iterator;
private List<ItemStatReport> allData;
private List<ItemStatReport> secondData;//二级数据源
private Integer currParentVal;
private static ThreadLocal<Integer> threadLocal = new ThreadLocal<Integer>() {
protected Integer initialValue() {
return 0;
}
};//保存线程变量
public PaAnCustomOfTwolJRdataSource(Collection<ItemStatReport> collection, Integer parentVal1) {
super(true);
this.currParentVal = parentVal1;
int length = collection.size();
if (length > 0) {
this.allData = (List<ItemStatReport>) collection;
List<ItemStatReport> dataList = new ArrayList<ItemStatReport>();
List<ItemStatReport> data = new ArrayList<ItemStatReport>();
//FIXME :加入排序方法
//TODO:加入获取数据源的算法。
int count = threadLocal.get();
int j = count;
for (; j < length; j++) {
ItemStatReport itemSr = allData.get(j);
Integer com1 = itemSr.getCompareCol1();
if (com1 != null && com1.intValue() == parentVal1.intValue()) {
dataList.add(itemSr);
count++;
} else {
break;
}
}
//reset variable count
if (count == length) {
count = 0;
}
threadLocal.set(new Integer(count));
//确定报表的行数。
for (int i = 0; i < dataList.size(); i += 13) {
ItemStatReport isr = dataList.get(i);
data.add(isr);
}
this.data = data;
this.secondData = dataList;
this.iterator = data.iterator();
}
}
public boolean next() {
boolean hasNext = false;
if (this.iterator != null) {
hasNext = this.iterator.hasNext();
if (hasNext) {
this.currentBean = this.iterator.next();
}
}
return hasNext;
}
public Object getFieldValue(JRField field) throws JRException {
Object value = null;
String fieldName = field.getName();
ItemStatReport currentObj = (ItemStatReport) currentBean;
String[] arr = fieldName.split("_");
if (arr.length > 1) {
int seqNumber = Integer.parseInt(arr[1]);
ItemStatReport positionObj = null;
for (ItemStatReport isr : secondData) {
if (isr.getSeqNumber() == seqNumber && currentObj.getCompareCol().intValue() == isr.getCompareCol().intValue()) {
positionObj = isr;
break;
}
}
if (positionObj == null) {
throw new RuntimeException("no found target data !");
}
value = getFieldValue(positionObj, field);
} else {
value = getFieldValue(currentBean, field);
}
return value;
}
}
这是我继承的两个JRAbstractBeanDataSource。
发表评论
-
jasperreport不适用子报表实现中国式分组报表功能
2014-08-16 13:40 1327副标题: 单行统计报表中如何通过一列的值决定另一 ... -
优化功能点
2013-11-11 14:25 514今日优化XX反馈响应太慢的功能点: 1.成立采购小组选择用 ... -
开发常见报m(_ _)m
2013-09-11 12:00 690struts1 使用BeanUtils填充界面录入数据报 错 ... -
加载程序时不能正常启动,加载xml报错
2013-09-04 10:39 2114报错日志: Caused by: org.springfr ... -
字符编码优秀文章收集
2013-06-26 10:18 691http://www.ibm.com/devel ... -
数据库存储数据使用字符集与程序的无关
2013-06-21 11:24 7971.开发项目代码使用UTF-8 2.数据储存数据使用GB ... -
文件下载至内存溢出
2013-05-10 09:31 5042同事文章: 部分项目的文件下载处理方式如下: B ... -
ireport 报表中不同行不同的样式
2013-01-13 16:32 1886转载自: http://lzfhope.b ... -
ibatis 配置调用存储过程,jdbctype配置
2012-12-14 10:34 1787数据库存储过程如下: procedure p_pr ... -
ibatus 调用存储过程返回id值
2012-12-13 20:49 714public Integer generateItem ... -
去掉数组中的重复元素
2012-12-03 15:11 936/** * 返回不包含重复元素的数组 * ... -
解析用户输入的字符串,加入回车换行符
2012-11-10 12:35 2924用户要求界面显示要根据用户的输入格式显示,于是用了< ... -
LazyValidatorForm
2011-12-21 19:29 16861. private Map formObjGenera ... -
eclipse 不编译工程
2011-09-29 09:35 689网摘: eclipse出现不编译工程的现象。怎么刷 ... -
解决客户端页面刷新重复保存数据问题
2011-09-14 21:09 13471.用户点“保存”调用save()方法保存数据。 2.当用户 ... -
jasperreport自定义JRDataSource
2011-07-29 22:08 5229package com.sniper.report ... -
附件测试
2011-06-17 10:10 593附件测试 -
文件下载
2011-06-01 16:50 643BufferedInputStream bis = ne ... -
使用extremecomponents之妙
2011-06-01 15:25 1271<ec:table items="no ... -
程序异常处理
2011-04-12 13:51 7401.程序中异常处理(思路): 1.代码要处理try{} ...
相关推荐
java报表开发软件包
Java报表开发技术深入解析
java报表开发工具使用教程,讲述怎样使用iReport工具制作jasperReport报表。
《Java报表开发技术深入解析》
java报表开发工具FineReport教程之参数入门:参数的种类与区别.docx
开发java报表的帮助文档,贡献给需要的各位。
Java报表开发示例ReportsCharts(含页面和后端代码)
java报表开发技术深入解析 源码下载 稳定性之于系统,就像健康之于人类,看起来重要不紧急,然而一旦失去,就追悔莫及。 稳定性是一切 0 前面的 1。 为什么要做这个专栏? 让无法解决的问题少一点点,让世界的确定性...
java报表工具开发详细手册
jasperreport+ireport开发java报表入门级教程(完整版)
内容概要: 理解数据填充的两种方式 熟练构造分组报表 熟练构造Chart图形报表 实现个人档案的PDF输出
java 水晶报表 开发希望对大家有用。java水晶报表开发,如有问题欢迎留言。此资源 是在实际过程中用过的技术。
java图形报表开发详解,内附API文档及柱状图表实例。
使用java开发web报表的解决方案,针对中国式复杂报表的全过程解决
表明当报表主体中绑定了多个单元格的时候,单元格间会天然存在某种关系,使单元格间存在数据过滤关系,并且跟随扩展,这就是父子格,前面的单元格称之为父格,后面的单元格称之为子格,也就是说子格的数据会根据父格...
主要用于完成java对报表的开发,掌握java技术对于复杂和简单图表的使用和高校开发
Java水晶报表发技术;Java水晶报表发技术;Java水晶报表发技术
java报表tooffice文档 本包由java语言开发,实现java报表到office文档word,excel等的导出,是java项目开发中不可缺少的工具.