集智平台报表动态合并单元格

在客户的业务系统中,往往要求对报表的展现格式有一些特殊的需求,如:在报表展现后,要求把相邻值相同的单元格进行合并,这样看数据会更加直观一些,集智平台报表支持合并单元格,但只是在报表设计时在设计器中进行合并,或者说通过集智平台的group函数来实现,但有些单元格要在计算后才能知道,如下图:

报表展现时要求将第三行值相同的单元格进行动态合并,下面介绍下该需求的实现方法。

润乾的iReport对象为报表计算后的结果对象,通过对该对象的灵活使用能很好实现该需求:

        //1、读取报表模板

        InputStream is = application.getResourceAsStream(“/reportFiles/hebing.raq”);

        ReportDefine rd =  (ReportDefine)ReportUtils.read(is);

        Context context = new Context();

        Engine e = new Engine( rd, context );

        IReport  report = e.calc();

        int startRow,endRow,startCol,endCol;

        int i,j,k;

         startRow=1;

        endRow=1;

        startCol=1;

        endCol=1;

        int rownum=report.getRowCount();

        int colnum=report.getColCount();

        for(i=1;i<rownum;i++){

        for(j=1;j<colnum-1;j++){

        Object s1=report.getCell(i,(short)j).getValue();

        Object s2=report.getCell(i,(short)(j+1)).getValue();

        if(s1!=null && s1==s2){

          startRow=i;

        endRow=i;

        startCol=j;

        endCol=j+1;

       // continue;

        System.out.println(““+(i)+”“+(j)+”“+s1.toString()+”“+(i)+”“+(j+1)+”“+s2.toString());

        System.out.println(“startRow1=”+(startRow)+”endRow1=”+(endRow)+”startCol1=”+(startCol)+”endCol1=”+(endCol));

      for(k=j+2;k<rownum;k++){

      System.out.println(“==============”);

      Object s3=report.getCell(i,(short)k).getValue();

     // System.out.println(“s3==========”+s3.toString()+”kkkk=”+(k));

      if(s1==s3){

      endCol=k;

      System.out.println(“+++++++++++++”);

 

      }

      else{

      k–;

      System.out.println(“k “+(k));

      break;

     // continue;

      }

         }

      Area area=new Area(startRow,(short)startCol,endRow,(short)endCol);

 

      if(!report.getCell(startRow,(short)startCol).isMerged()){

          System.out.println(“startRow=”+(startRow)+”endRow=”+(endRow)+”startCol=”+(startCol)+”endCol=”+(endCol));

         ReportUtils.mergeReport(report,area);

         }

          System.out.println(“合并完成“);

             }

        }

        }

 

         String rptName = “RPT_”+Double.toString(Math.random());

         request.setAttribute(rptName,report);

通过该方法就能实现报表展现后如果相邻单元格的值相同,能够将单元格合并,如下图:

此方法为动态设置横向单元格,如果设置纵向动态合并,更改该代码先列后行循环即可。