? ? ? ?《jasperreport 自定义javaBean数据源》
一:说明:
1.目前公司要做一类报表,统计要求显示从1月份到12月份的所有数据。且每个月份的数据列头都是一样的。见图:
2.由于用户运行环境要求,我们的报表数据源只能采用javabean的方式。
3.报表模块设计。
?? 由于我们使用ireport设计报表模板,所以报表的列头,是不能通过循环生成的(即循环从1月到12月的列头),只能通过画出1月到12月的列头。见图:
二:实现生成报表:
? ?1.普通的做法是。定义一个javaben类,包含从1月到12月份的所有字段。eg:
??public class RepProjectStockModeSumReportextends BaseObject implements java.io.Serializable {
???????? privateString stockMode; //采购模式
???????? privateDouble stockNumber1; //数量
???????? privateDouble paStockPrice1; //平安采购价格
???????? privateDouble marketPrice1; //市场价格
???????? privateDouble marketSaveMoney1; //节约金额
???????? privateDouble marketSaveMoneyPer1; //节约比例
???????? privateDouble stockNumber2; //
???????? privateDouble paStockPrice2; //
???????? privateDouble marketPrice2; //
???????? privateDouble marketSaveMoney2; //
???????? privateDouble marketSaveMoneyPer2; //
}
?每一行就是一个model记录。
?这个是比较常用,比较简单的做法,也可以说是最稳定的做法。一般情况下,我们应该用它,除非你是跟我一样,不着实际的人。
?2.我的做法:
?? publicclass RepProjectStockModeSumReport extends BaseObject implementsjava.io.Serializable {
???????? privateString stockMode; //采购模式
???????? privateDouble stockNumber; //数量
???????? privateDouble paStockPrice; //平安采购价格
???????? privateDouble marketPrice; //市场价格
???????? privateDouble marketSaveMoney; //节约金额
???????? privateDouble marketSaveMoneyPer; //节约比例
}
即只列出一月份的属性,每个实体代表每个月份下的一行数据。
及一行下存在多条model数据。
三:自定义javabean数据源:
自定义javabean数据源很简单,只需要继承extends JRAbstractBeanDataSource就行了,同时实现next()和getFieldValue方法。
通过在自定义的javabean数据源中,指定获取当前显示数据的规则,从而决定当前显示那一条model数据。
eg:
public class PaAnCustomJRdataSource extendsJRAbstractBeanDataSource {
?
???????? privateCollection<ItemStatReport> data;
???????? privateObject currentBean;
???????? privateIterator<ItemStatReport> iterator;
???????? privateList<ItemStatReport> allData;
???????? privateint index = -1;
?
???????? publicPaAnCustomJRdataSource(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>() {
???????????????????????????????????? publicint compare(ItemStatReport o1, ItemStatReport o2) {
?????????????????????????????????????????????? returno1.getSeqNumber() - o2.getSeqNumber();
???????????????????????????????????? }
??????????????????????????? });
??????????????????????????? List<ItemStatReport>dataList = new ArrayList<ItemStatReport>();
??????????????????????????? ItemStatReportitmesr = list.get(0);
??????????????????????????? intseqNumber = itmesr.getSeqNumber();
??????????????????????????? for(ItemStatReport isr : allData) {
???????????????????????????????????? if(isr.getSeqNumber() == seqNumber) {
?????????????????????????????????????????????? dataList.add(isr);
???????????????????????????????????? }else {
?????????????????????????????????????????????? break;
???????????????????????????????????? }
??????????????????????????? }
??????????????????????????? this.data= dataList;
??????????????????????????? this.iterator= data.iterator();
?????????????????? }
?
???????? }
???????? publicboolean next() {
?????????????????? index++;
?????????????????? booleanhasNext = false;
?????????????????? if(this.iterator != null) {
??????????????????????????? hasNext= this.iterator.hasNext();
??????????????????????????? if(hasNext) {
???????????????????????????????????? this.currentBean= this.iterator.next();
??????????????????????????? }
?????????????????? }
?????????????????? returnhasNext;
???????? }
???????? publicObject getFieldValue(JRField field) throws JRException {
?????????????????? Objectvalue = null;
?????????????????? StringfieldName = field.getName();
?????????????????? String[]arr = fieldName.split("_");
?????????????????? if(arr.length > 1) {
??????????????????????????? intseqNumber = Integer.parseInt(arr[1]);
??????????????????????????? intdataLength = this.data.size();
??????????????????????????? intinteNumber = (seqNumber * dataLength) + this.index;
??????????????????????????? ItemStatReportpositionObj = this.allData.get(inteNumber);
??????????????????????????? ItemStatReportcurrentObj = (ItemStatReport) currentBean;
??????????????????????????? if(currentObj.getCompareCol().intValue() == positionObj.getCompareCol().intValue()){
???????????????????????????????????? value= getFieldValue(positionObj, field);
??????????????????????????? }else {
???????????????????????????????????? thrownew RuntimeException("no found target Object !");
??????????????????????????? }
?????????????????? }else {
??????????????????????????? value= getFieldValue(currentBean, field);
?????????????????? }
?????????????????? returnvalue;
???????? }
}
public class PaAnCustomOfTwolJRdataSourceextends JRAbstractBeanDataSource {
???????? privateCollection<ItemStatReport> data;
???????? privateObject currentBean;
???????? privateIterator<ItemStatReport> iterator;
???????? privateList<ItemStatReport> allData;
???????? privateList<ItemStatReport> secondData;//二级数据源
???????? privateInteger currParentVal;
???????? privatestatic ThreadLocal<Integer> threadLocal = newThreadLocal<Integer>() {
?????????????????? protectedInteger initialValue() {
??????????????????????????? return0;
?????????????????? }
???????? };//保存线程变量
?
???????? publicPaAnCustomOfTwolJRdataSource(Collection<ItemStatReport> collection,Integer parentVal1) {
?????????????????? super(true);
?????????????????? this.currParentVal= parentVal1;
?????????????????? intlength = collection.size();
?????????????????? if(length > 0) {
??????????????????????????? this.allData= (List<ItemStatReport>) collection;
??????????????????????????? List<ItemStatReport>dataList = new ArrayList<ItemStatReport>();
??????????????????????????? List<ItemStatReport>data = new ArrayList<ItemStatReport>();
??????????????????????????? //FIXME:加入排序方法
??????????????????????????? //TODO:加入获取数据源的算法。
??????????????????????????? intcount = threadLocal.get();
??????????????????????????? intj = count;
??????????????????????????? for(; j < length; j++) {
???????????????????????????????????? ItemStatReportitemSr = allData.get(j);
???????????????????????????????????? Integercom1 = itemSr.getCompareCol1();
???????????????????????????????????? if(com1 != null && com1.intValue() == parentVal1.intValue()) {
?????????????????????????????????????????????? dataList.add(itemSr);
?????????????????????????????????????????????? count++;
???????????????????????????????????? }else {
?????????????????????????????????????????????? break;
???????????????????????????????????? }
??????????????????????????? }
??????????????????????????? //resetvariable count
??????????????????????????? if(count == length) {
???????????????????????????????????? count= 0;
??????????????????????????? }
??????????????????????????? threadLocal.set(newInteger(count));
??????????//确定报表的行数。
??????????????????????????? for(int i = 0; i < dataList.size(); i += 13) {
???????????????????????????????????? ItemStatReportisr = dataList.get(i);
???????????????????????????????????? data.add(isr);
??????????????????????????? }
??????????????????????????? this.data= data;
??????????????????????????? this.secondData= dataList;
??????????????????????????? this.iterator= data.iterator();
?????????????????? }
???????? }
???????? publicboolean next() {
?????????????????? booleanhasNext = false;
?????????????????? if(this.iterator != null) {
??????????????????????????? hasNext= this.iterator.hasNext();
??????????????????????????? if(hasNext) {
???????????????????????????????????? this.currentBean= this.iterator.next();
??????????????????????????? }
?????????????????? }
?????????????????? returnhasNext;
???????? }
???????? publicObject getFieldValue(JRField field) throws JRException {
?????????????????? Objectvalue = null;
?????????????????? StringfieldName = field.getName();
?????????????????? ItemStatReportcurrentObj = (ItemStatReport) currentBean;
?????????????????? String[]arr = fieldName.split("_");
?????????????????? if(arr.length > 1) {
??????????????????????????? intseqNumber = Integer.parseInt(arr[1]);
??????????????????????????? ItemStatReportpositionObj = null;
??????????????????????????? for(ItemStatReport isr : secondData) {
???????????????????????????????????? if(isr.getSeqNumber() == seqNumber &¤tObj.getCompareCol().intValue() == isr.getCompareCol().intValue()) {
?????????????????????????????????????????????? positionObj= isr;
?????????????????????????????????????????????? break;
???????????????????????????????????? }
??????????????????????????? }
??????????????????????????? if(positionObj == null) {
???????????????????????????????????? thrownew RuntimeException("no found target data !");
??????????????????????????? }
??????????????????????????? value= getFieldValue(positionObj, field);
?????????????????? }else {
??????????????????????????? value= getFieldValue(currentBean, field);
?????????????????? }
?????????????????? returnvalue;
???????? }
}
这是我继承的两个JRAbstractBeanDataSource。
?
????
?