纵向同值单元格的合并
客户要求:对报表的展现格式进行合并如:在报表展现后,要求把相邻值相同的单元格进行合并,这样看数据会更加直观一些,支持合并单元格,但只是在报表复杂报表设计,设计时在设计器中进行合并,或者说通过快逸的group函数来实现,但有些单元格要在计算后才能知道,
第一步:建立报表,如图一:
图一
第二步:Api合并单元格
报表展现时要求将最后一列值相同的单元格进行动态合并,下面介绍下该需求的实现方法。
润乾的iReport对象为报表计算后的结果对象,通过对该对象的灵活使用能很好实现该需求:
<%@ page contentType=”text/html;charset=GBK” %>
<%@ taglib uri=”/WEB-INF/runqianReport4.tld” prefix=”report” %>
<%@ page import=”com.runqian.report4.usermodel.*”%>
<%@ page import=”com.runqian.report4.view.*” %>
<%@ page import=”com.runqian.report4.model.*” %>
<%@ page import=”com.runqian.report4.model.engine.*” %>
<%@ page import=”com.runqian.report4.util.ReportUtils” %>
<%@ page import=”com.runqian.report4.view.xml.XMLReport,com.runqian.report4.cache.*,com.runqian.report4.usermodel.*”%>
<%@ page import=”java.util.*”%>
<%@ page import=”java.sql.*”%>
<%@ page import=”java.io.*”%>
<%
request.setCharacterEncoding( “GBK” );
//1、读取报表模板
InputStream is = application.getResourceAsStream(“/reportFiles/group.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-1;i++){
for(j=1;j<colnum;j++){
Object s1=report.getCell(i,(short)j).getValue();
Object s2=report.getCell(i+1,(short)j).getValue();
if(s1!=null && s1==s2){
startRow=i;
endRow=i+1;
startCol=j;
endCol=j;
// continue;
for(k=i+2;k<rownum;k++){
System.out.println(“————–”);
Object s3=report.getCell(k,(short)j).getValue();
// System.out.println(“s3==========”+s3.toString()+”kkkk=”+(k));
if(s1==s3){
endRow=k;
}
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());
//3、计算报表
request.setAttribute(rptName,report);
%>
<report:html name=”report1″ beanName=”<%=rptName%>” srcType=”defineBean”
needPrint=”yes”
needSaveAsExcel=”yes”
/>
第三步:利用jsp发布报表