当前位置: 代码迷 >> 报表 >> java 表格开发
  详细解决方案

java 表格开发

热度:199   发布时间:2016-05-05 07:54:44.0
java 报表开发

? ? ? ?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 &&currentObj.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

?

????

?

  相关解决方案