集智平台报表动态合并单元格
在客户的业务系统中,往往要求对报表的展现格式有一些特殊的需求,如:在报表展现后,要求把相邻值相同的单元格进行合并,这样看数据会更加直观一些,集智平台报表支持合并单元格,但只是在报表设计时在设计器中进行合并,或者说通过集智平台的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);
通过该方法就能实现报表展现后如果相邻单元格的值相同,能够将单元格合并,如下图:
此方法为动态设置横向单元格,如果设置纵向动态合并,更改该代码先列后行循环即可。