`

java 报表开发

    博客分类:
  • java
 
阅读更多

       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

 

    

 

  • 大小: 29.4 KB
  • 大小: 28 KB
分享到:
评论

相关推荐

    java报表开发

    java报表开发软件包

    Java报表开发技术深入解析

    Java报表开发技术是Java应用程序中不可或缺的一部分,它用于生成、展示和分析数据,帮助企业做出决策。深入解析这一领域,我们需要了解多个关键知识点,包括报表工具的选择、报表设计、数据源处理、动态数据过滤以及...

    《Java报表开发技术深入解析》PDF

    《Java报表开发技术深入解析》是一本专注于Java平台上的报表开发技术的专业书籍。该书针对Java开发者,旨在帮助他们理解和掌握如何在Java应用程序中设计、创建和展示复杂的报表。通过阅读此书,读者将能够了解到Java...

    iReport(java报表开发工具使用教程)

    iReport是一款基于Java的...总结,iReport作为一款强大的Java报表开发工具,不仅简化了报表设计过程,还提供了丰富的功能和灵活性。通过学习和实践,开发者能够创建出满足各种需求的精美报表,提升业务分析和决策效率。

    java报表工具开发详细手册

    JasperReport与iReport是Java报表开发领域的强大工具组合,通过本手册的学习,开发者将能够掌握这些工具的基本操作和高级功能,从而在实际项目中高效地完成报表设计与开发工作。无论是入门还是进阶,这份手册都将是...

    Java报表开发ReportsCharts.docx

    在"Java报表开发ReportsCharts.docx"的描述中,主要涉及了数据填充、分组报表构造、图表生成以及个人档案的PDF输出四个关键知识点。 1. **数据填充**: - **Parameters(参数)填充**:参数主要用于在运行时将程序...

    Java报表开发示例ReportsCharts(含页面和后端代码).zip

    Java报表开发是一个重要的领域,尤其在企业级应用中,数据可视化和报告生成是不可或缺的功能。本示例"ReportsCharts"提供了完整的页面展示和后端处理代码,帮助开发者更好地理解和实践Java报表开发。以下是对这个...

    java报表的开发

    【Java报表开发】Java报表开发主要涉及利用Java技术来创建和管理各种类型的报表,包括复杂的图表和高效的数据呈现。在Java环境下,报表工具通常分为两类:纯Java报表工具和支持Java的报表工具。 **支持Java的报表...

    java报表开发技术深入解析源码下载-StabilityGuide:【稳定大于一切】打造国内稳定性领域知识库,让无法解决的问题少一点点,让世界

    java报表开发技术深入解析 源码下载 稳定性之于系统,就像健康之于人类,看起来重要不紧急,然而一旦失去,就追悔莫及。 稳定性是一切 0 前面的 1。 为什么要做这个专栏? 让无法解决的问题少一点点,让世界的确定性...

    jasperreport ireport开发java报表入门级教程(完整版).rar

    本教程“jasperreport ireport开发java报表入门级教程(完整版)”将引导初学者逐步掌握这些概念和操作,通过实际项目练习,加深理解,提升报表开发能力。教程内容可能涵盖报表设计基础、数据绑定、报表生成、Java应用...

    JAVA报表解决方案源码

    总之,"JAVA报表解决方案源码"是一个深入理解Java报表开发的实践平台,对于提升Java开发者的报表设计和实现能力具有重要意义。通过深入学习和实践,开发者不仅可以解决当前项目中的报表需求,还能为未来更复杂的数据...

    java报表技术实例

    Java报表技术是软件开发中不可或缺的一部分,特别是在企业级应用中,用于数据的展示和分析。JasperReports作为Java领域的一款强大...无论是初学者还是经验丰富的开发者,都能从中受益,提升自己的Java报表开发技能。

    javabaobiao.rar_java 报表_java报表

    学习Java报表开发需要掌握以下几个核心概念: 1. **数据源**:报表数据通常来自数据库、XML文件、CSV文件或其他业务系统。 2. **模板设计**:设计报表布局,包括字段、表格、图表等元素。 3. **报表引擎**:处理数据...

    Java报表工具和示例代码

    对于初学者来说,这是一个很好的起点,能够帮助快速掌握Java报表开发的基本技能。而对于有经验的开发者,这些示例代码可以作为参考,以适应特定的业务需求或优化现有报表系统。 在实际项目中,报表工具不仅可以用于...

    jasperreport+ireport开发java报表入门级教程(完整版).

    ### 使用JasperReport和iReport进行Java报表开发 JasperReport是一款开源报表工具,常用于Java应用程序中生成复杂的报表。结合iReport设计工具,开发者可以轻松地创建、编辑和预览报表模板。接下来,我们将探讨如何...

    java水晶报表开发

    Java水晶报表开发是一种在Java应用中创建、设计和展示复杂报表的重要技术。水晶报表(Crystal Reports)是由SAP公司开发的一款强大的报表工具,它能够帮助开发者整合数据源,设计美观的报表,并支持导出多种格式,如...

    java报表,经典案例

    在Java报表开发中,有多个流行框架和库可供选择,如JasperReports、iReport、BIRT(Business Intelligence and Reporting Tools)、Pentaho Kettle等。这些工具提供了一系列API和可视化设计工具,帮助开发者创建复杂...

Global site tag (gtag.js) - Google Analytics