- 浏览: 197202 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (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 1374副标题: 单行统计报表中如何通过一列的值决定另一 ... -
优化功能点
2013-11-11 14:25 550今日优化XX反馈响应太慢的功能点: 1.成立采购小组选择用 ... -
开发常见报m(_ _)m
2013-09-11 12:00 720struts1 使用BeanUtils填充界面录入数据报 错 ... -
加载程序时不能正常启动,加载xml报错
2013-09-04 10:39 2163报错日志: Caused by: org.springfr ... -
字符编码优秀文章收集
2013-06-26 10:18 721http://www.ibm.com/devel ... -
数据库存储数据使用字符集与程序的无关
2013-06-21 11:24 8361.开发项目代码使用UTF-8 2.数据储存数据使用GB ... -
文件下载至内存溢出
2013-05-10 09:31 5089同事文章: 部分项目的文件下载处理方式如下: B ... -
ireport 报表中不同行不同的样式
2013-01-13 16:32 1937转载自: http://lzfhope.b ... -
ibatis 配置调用存储过程,jdbctype配置
2012-12-14 10:34 1830数据库存储过程如下: procedure p_pr ... -
ibatus 调用存储过程返回id值
2012-12-13 20:49 748public Integer generateItem ... -
去掉数组中的重复元素
2012-12-03 15:11 978/** * 返回不包含重复元素的数组 * ... -
解析用户输入的字符串,加入回车换行符
2012-11-10 12:35 2963用户要求界面显示要根据用户的输入格式显示,于是用了< ... -
LazyValidatorForm
2011-12-21 19:29 17461. private Map formObjGenera ... -
eclipse 不编译工程
2011-09-29 09:35 726网摘: eclipse出现不编译工程的现象。怎么刷 ... -
解决客户端页面刷新重复保存数据问题
2011-09-14 21:09 13861.用户点“保存”调用save()方法保存数据。 2.当用户 ... -
jasperreport自定义JRDataSource
2011-07-29 22:08 5267package com.sniper.report ... -
附件测试
2011-06-17 10:10 617附件测试 -
文件下载
2011-06-01 16:50 680BufferedInputStream bis = ne ... -
使用extremecomponents之妙
2011-06-01 15:25 1310<ec:table items="no ... -
程序异常处理
2011-04-12 13:51 7791.程序中异常处理(思路): 1.代码要处理try{} ...
相关推荐
java报表开发软件包
Java报表开发技术是Java应用程序中不可或缺的一部分,它用于生成、展示和分析数据,帮助企业做出决策。深入解析这一领域,我们需要了解多个关键知识点,包括报表工具的选择、报表设计、数据源处理、动态数据过滤以及...
《Java报表开发技术深入解析》是一本专注于Java平台上的报表开发技术的专业书籍。该书针对Java开发者,旨在帮助他们理解和掌握如何在Java应用程序中设计、创建和展示复杂的报表。通过阅读此书,读者将能够了解到Java...
iReport是一款基于Java的...总结,iReport作为一款强大的Java报表开发工具,不仅简化了报表设计过程,还提供了丰富的功能和灵活性。通过学习和实践,开发者能够创建出满足各种需求的精美报表,提升业务分析和决策效率。
JasperReport与iReport是Java报表开发领域的强大工具组合,通过本手册的学习,开发者将能够掌握这些工具的基本操作和高级功能,从而在实际项目中高效地完成报表设计与开发工作。无论是入门还是进阶,这份手册都将是...
在"Java报表开发ReportsCharts.docx"的描述中,主要涉及了数据填充、分组报表构造、图表生成以及个人档案的PDF输出四个关键知识点。 1. **数据填充**: - **Parameters(参数)填充**:参数主要用于在运行时将程序...
Java报表开发是一个重要的领域,尤其在企业级应用中,数据可视化和报告生成是不可或缺的功能。本示例"ReportsCharts"提供了完整的页面展示和后端处理代码,帮助开发者更好地理解和实践Java报表开发。以下是对这个...
【Java报表开发】Java报表开发主要涉及利用Java技术来创建和管理各种类型的报表,包括复杂的图表和高效的数据呈现。在Java环境下,报表工具通常分为两类:纯Java报表工具和支持Java的报表工具。 **支持Java的报表...
java报表开发技术深入解析 源码下载 稳定性之于系统,就像健康之于人类,看起来重要不紧急,然而一旦失去,就追悔莫及。 稳定性是一切 0 前面的 1。 为什么要做这个专栏? 让无法解决的问题少一点点,让世界的确定性...
本教程“jasperreport ireport开发java报表入门级教程(完整版)”将引导初学者逐步掌握这些概念和操作,通过实际项目练习,加深理解,提升报表开发能力。教程内容可能涵盖报表设计基础、数据绑定、报表生成、Java应用...
总之,"JAVA报表解决方案源码"是一个深入理解Java报表开发的实践平台,对于提升Java开发者的报表设计和实现能力具有重要意义。通过深入学习和实践,开发者不仅可以解决当前项目中的报表需求,还能为未来更复杂的数据...
Java报表技术是软件开发中不可或缺的一部分,特别是在企业级应用中,用于数据的展示和分析。JasperReports作为Java领域的一款强大...无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的Java报表开发技能。
学习Java报表开发需要掌握以下几个核心概念: 1. **数据源**:报表数据通常来自数据库、XML文件、CSV文件或其他业务系统。 2. **模板设计**:设计报表布局,包括字段、表格、图表等元素。 3. **报表引擎**:处理数据...
对于初学者来说,这是一个很好的起点,能够帮助快速掌握Java报表开发的基本技能。而对于有经验的开发者,这些示例代码可以作为参考,以适应特定的业务需求或优化现有报表系统。 在实际项目中,报表工具不仅可以用于...
### 使用JasperReport和iReport进行Java报表开发 JasperReport是一款开源报表工具,常用于Java应用程序中生成复杂的报表。结合iReport设计工具,开发者可以轻松地创建、编辑和预览报表模板。接下来,我们将探讨如何...
Java水晶报表开发是一种在Java应用中创建、设计和展示复杂报表的重要技术。水晶报表(Crystal Reports)是由SAP公司开发的一款强大的报表工具,它能够帮助开发者整合数据源,设计美观的报表,并支持导出多种格式,如...
在Java报表开发中,有多个流行框架和库可供选择,如JasperReports、iReport、BIRT(Business Intelligence and Reporting Tools)、Pentaho Kettle等。这些工具提供了一系列API和可视化设计工具,帮助开发者创建复杂...