package com.product.server.report.service; import java.text.DecimalFormat; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import com.product.core.entity.DataTableEntity; import com.product.core.entity.FieldSetEntity; import com.product.core.exception.BaseException; import org.apache.log4j.Logger; public class ReportServerNew { private Report report; private DecimalFormat df=(DecimalFormat)NumberFormat.getInstance(); private java.text.SimpleDateFormat format; public static Logger logger=Logger.getLogger(ReportServerNew.class); /** * 分组报表自动根据Report数据进行分组 * 在调创建报表前,需对报表配置数据进行验证,错误信息直接显示在界面中。否则空易出错。String checked=this.toCheckReport(); * @return * @throws BaseException */ public String toCreateGroupReport() throws BaseException{ StringBuffer html=new StringBuffer(); String fixHeader[]=null; if(report.isFixHeader()){ fixHeader=fixHeader(); } if(fixHeader!=null && fixHeader.length>0){ html.append(fixHeader[0]); } html.append(" "); //不是固定表头 if(!report.isFixHeader()){html.append(createTitleNew());} // html.append(createTitle()); if(fixHeader!=null && fixHeader.length>1){ html.append(fixHeader[1]); } html.append(createBody()); html.append("
"); if(fixHeader!=null && fixHeader.length>2){ html.append(fixHeader[2]); } if(fixHeader!=null ){//不能调到init方法 //html.append(fixHeaderScrollScript()); } //html.append(appendOnloadMethod());//js法加 //System.out.println("appendOnloadMethod:"+appendOnloadMethod()); //html.append(this.rowClickColorScript());//js法加 //System.out.println("rowClickColorScript:"+this.rowClickColorScript()); // html.append(""); //System.out.println(" +++++++++++++++++++++++++++++++++ htm:"+html.toString()); if(report.isPage()) return html+toPageHtml(report.getTotalRow(),report.getCurrentPage(),report.getPageSize()); else return html.toString(); } /** * 固定表头后,左右滚动时,表头同步滚动 * @return */ private String fixHeaderScrollScript(){ StringBuffer html=new StringBuffer(); html.append(""); return html.toString(); } /** * 固定表头 * @return */ private String[] fixHeader(){ StringBuffer html=new StringBuffer(); html.append("
"); html.append(" "); // html.append(" "); // html.append(" "); // html.append(" "); String colgroup=createFixTitleColgroup(); html.append(colgroup); html.append(" "); //html.append(" html.append(createTitleNew()); html.append(" "); html.append("
序号内容内容
"); html.append("
"); html.append("
"); return new String[]{html.toString(),colgroup,"
"}; } /** * 创建标题栏,多级标题,支持合并标题 6.5 * @return */ private String createFixTitleColgroup(){ StringBuffer title=new StringBuffer(); title.append(""); if(report.getTitle()!=null){ //int width[]=new int[report.getTitle()[report.getTitle().length-1].length];//最后一行 int width[]=report.getColWidth(); // for(int i=0;i0&&report.getColspan()[i][j]>0){ //被合并的行可列 设置为0 // int c = computeTitleColWidth(i,j); // if(c > width[j]&&i==report.getTitle().length-1){ // width[j] = c; // } // } // } // } for(int i=0;i < width.length;i++){ // if(i != width.length-1) title.append(""); // else // title.append(""); } } title.append(""); return title.toString(); } public String getReportTitle(){ StringBuffer html=new StringBuffer(); html.append(" "); html.append(createTitleNew()); html.append("
"); return html.toString(); } public String getTableHeader(){ StringBuffer html=new StringBuffer(); html.append(" "); html.append(createTitleNewForShow()); html.append("
"); return html.toString(); } /** * 创建标题栏,多级标题,支持合并标题 6.5 * @return */ private String createTitleNewForShow(){ StringBuffer title=new StringBuffer(); // title.append(""); if(report.getTitle()!=null){ for(int i=0;i"); title.append(" "); for(int j=0;j0&&report.getColspan()[i][j]>0){ //被合并的行可列 设置为0 title.append(" ") .append(report.getTitle()[i][j]).append(""); } } title.append(" "); } } //System.out.println("title:"+title.toString()); // title.append(""); return title.toString(); } /** * 创建标题栏,多级标题,支持合并标题 6.5 * @return */ private String createTitleNew(){ StringBuffer title=new StringBuffer(); // title.append(""); if(report.getTitle()!=null){ for(int i=0;i"); title.append(" "); for(int j=0;j0&&report.getColspan()[i][j]>0){ //被合并的行可列 设置为0 title.append(" ") .append(report.getTitle()[i][j]).append(""); } } title.append(" "); } } //System.out.println("title:"+title.toString()); // title.append(""); return title.toString(); } /** * 创建标题栏,多级标题,支持合并标题 * @return */ private String createTitle(){ StringBuffer title=new StringBuffer(); title.append(""); if(report.getTitle()!=null){ for(int i=0;i"); for(int j=0;j0&&report.getColspan()[i][j]>0){ //被合并的行可列 设置为0 title.append(" ") .append(report.getTitle()[i][j]).append(""); } } title.append(" "); } } title.append(""); return title.toString(); } /** * 计算标题列的宽度 * @param titleRow * @param titleCol * @return */ private int computeTitleColWidth(int titleRow,int titleCol){ int colspan=report.getColspan()[titleRow][titleCol]; int startColIndex=0;//合并列的开始列 int endColIndex=0;//合并列的结束列 int width=0;//列的宽度 for(int i=0;i totalValue =initTotal(); //记录分组字段的上一条不同的值 String oldGroupValue[]=new String [report.getField().length]; //记录分组字段上一条不同值的下标 int groupIndex[]=new int [report.getField().length]; //记录分组字段上一条不同值的合并行数,指 定rowspan int groupRow[][]=new int [report.getDt().getRows()][report.getField().length]; //记录单元格是合并 StringBuffer rowSpan=new StringBuffer(); body.append(""); //logger.error("总行:"+report.getDt().getRow()); for(int i=0;report.getDt()!=null&& i"); StringBuffer groupv=new StringBuffer(); for(int j=0;j0)groupv.append("_"); groupv.append(value==null?"":value); } if(j<=report.getMaxGroupFieldIndex() && groupv.toString().equals(group[j]) ) //当前分组字段值与前一条数据的同一分组字段的不相等,表示要分组合计 { continue; //分组字段,如是不是第一条,不生成td } //------------------------- body.append(""); if(report.getUrl()!=null&&report.getUrl()[j]!=null){ body.append("");// 穿 透查询地址 } body.append(value==null?"":formatData(value,j));//值 if(report.getUrl()!=null&&report.getUrl()[j]!=null){ body.append(""); } body.append("\r\n"); if(report.getTotalField()!=null && report.getTotalField()[j]){//合计字段 toAddTotalValue(totalValue,j,f.getDouble(report.getField()[j]),"SUM");//分组字段的合计,在不同的组时,会清空 } } body.append(""); } //最后一行后面再生成统计 if(report.getGroupField()!=null&&report.getDt().getRows()>0){ int lastRow=report.getDt().getRows()-1; body.append(createTotalRow(lastRow+1,totalValue,oldGroupValue,groupIndex,groupRow,null,true,body)); } //最后生成一行总的统计 if(report.isTotal()&&totalValue!=null) body.append(createTotalAll(totalValue)); body.append(""); //最后生成 合并行javascript脚本 for(int k=0;report.getMaxGroupFieldIndex()>=0&&k0)rowSpan.append("~"); //行下标=字段名+行下标=合并行数=列下标 rowSpan.append(k).append("=").append(report.getField()[m]).append(k).append("=").append(groupRow[k][m]). append("=").append(m); } } body.append(""); body.append(""); if(report.isShowTotalRow()){ body.append(""); } //logger.error("===="+body); return body.toString(); } /** * 格式化数据 * @param i * @param j * @return */ private Object formatData(Object value ,int j){ //logger.error("数据格式化1:"+value+" "+j ); String format=report.getFormat()[j]; //logger.error("数据格式化2:"+j+" "+format); try{ if(value==null||format==null||"".equals(value.toString().trim())){//字符串 return value; }else if(format.indexOf("#")==0&&format.indexOf("%")>0){//百分比 df.applyPattern(format); return df.format(Double.parseDouble(value.toString())); }else if(format.indexOf("#")>=0){//数字 df.applyPattern(format); Object o=df.format(Double.parseDouble(value.toString())); //logger.error("数据格式化3:"+j+" "+o); return o; }else {//日期 this.format=new SimpleDateFormat(format); return this.format.format((Date)value); } }catch(Exception e){ e.printStackTrace(); return value; } } /** * 生成总的合计 * @return */ private String createTotalAll(Map totalValue){ StringBuffer total=new StringBuffer(); double tv[]=(double[])totalValue.get("all"); if(report.getTotalField()!=null){ total.append(""); int v=0; boolean b=true; for(int i=0;i ") .append(formatData(tv[i],i))//值 .append(""); }else if(i==0){ total.append("总计:"); v++; }else if(!b){ total.append(" "); }else { v++; } } total.append(""); int c=total.indexOf("[total]"); if(c>=0) total.replace(c, c+7, (v==0?1:v)+""); } return total.toString(); } /** * 最后一个分组字段才执行生成合计行 * 并且从最后一个分组字段往前生成,例如:公司、部门、人员三个分组字段,从人员、部门、公司执行 * @param rowIndex * @param fieldIndex * @param totalValue * @param oldGroupValue * @param groupIndex * @param groupRow * @return */ private StringBuffer createTotalRow(int i,Map totalValue,String oldGroupValue[],int groupIndex[],int groupRow[][],FieldSetEntity values,boolean isEnd,StringBuffer body) throws BaseException{ StringBuffer group=new StringBuffer(); int colspan=0; // for(int c=0;c<=report.getMaxGroupFieldIndex();c++){ for(int c=report.getMaxGroupFieldIndex();c>=0;c--){ //如果不是分组字段,则返回 if(report.getGroupField()==null || !report.getGroupField()[c]){ return group; } StringBuffer temp=new StringBuffer(); //取分组字段及前面的分组字段值 组合 StringBuffer groupv=new StringBuffer(); for(int b=0;b<=c;b++){ if(groupv.length()>0)groupv.append("_"); groupv.append(values==null?"":values.getString(report.getField()[b])); } if( i>0){ //第一条数据不用统计 ,从第二条数据开始 groupRow[groupIndex[c]][c]=groupRow[groupIndex[c]][c]+1; if(!groupv.toString().equals(oldGroupValue[c]) //当前分组字段值与前一条数据的同一分组字段的不相等,表示要分组合计 ||isEnd //是否为数据集的是最后一条 ){ //logger.error("当前列:"+c+" 合并行数:"+groupRow[groupIndex[c]][c]); if(groupRow[groupIndex[c]][c]>1) { temp.append(""); colspan=report.getMaxGroupFieldIndex()-c+1; temp.append(" ") .append(oldGroupValue[c]) .append(" 合计:"); //循环分组字段后的数据统计字段 for(int k=report.getMaxGroupFieldIndex()+1;k").append(formatData(tv[k],k)).append(""); }else{ temp.append("  "); } temp.append("\r\n"); } temp.append(" "); //合计行结束 //同时当前分组前面的分组字段的rowspan要加1 for(int m=c-1;m>=0;m--){ groupRow[groupIndex[m]][m]=groupRow[groupIndex[m]][m]+1; } } String rspan="rowspan='"+report.getField()[c]+groupIndex[c]+"'"; String rowspanNum="rowspan='"+ (groupRow[groupIndex[c]][c]) +"'"; int rowspan=body.indexOf(rspan); if(rowspan>0) { if(groupRow[groupIndex[c]][c]>1) { body.replace(rowspan,rowspan+rspan.length(),rowspanNum);//替换成行数 }else { body.replace(rowspan,rowspan+rspan.length(),"");//替换成空 } } if(i < groupRow.length) { groupIndex[c]=i; } totalValue.put(report.getField()[c],new double[report.getField().length]); } } else{ groupIndex[c]=i; // groupRow[i][c]+=1; } oldGroupValue[c]=groupv.toString(); group.append(temp); } return group; } /** * 添加合计数据 * @param m * @param index * @param d */ private void toAddTotalValue(Map m,int index,Double d,String type){ Iterator keys=m.keySet().iterator(); while(keys.hasNext()){ Object key=keys.next(); double ds[]=(double[])m.get(key); if("SUM".equals(type)){//统计类型 可以是平均数 合计 ds[index]+=d==null?0.0:d.doubleValue(); } m.put(key.toString(), ds); } } /** * 初始化合计变量,根据分组字段 * @return */ private Map initTotal(){ Map m=new HashMap(); for(int i=0;report.getGroupField()!=null&&i=0){ int end=url.indexOf('~', index+1); if(end>0&&end>index){ String dfield=url.substring(index, end+1);//#{xxx} //String field=url.substring(index+1, end);//取出字段名 String field=dfield.replaceAll("~",""); //System.out.println(dfield+"|"+field); if("".equals(field.trim())||f.getValue(field)==null){ url=url.replaceFirst(dfield,""); }else{ url=url.replaceFirst(dfield, f.getString(field)); } } } return url; } /** * 页面初始加载调用方法 * @param method */ public String appendOnloadMethod(){ //System.out.println("-----------------------进入 appendOnloadMethod()"); StringBuilder b=new StringBuilder(); b.append("\n\r"); return b.toString(); } /** * 添加数据行选中颜色变化的javascript 代码 * @return */ public String rowClickColorScript(){ //System.out.println("-----------------------进入 rowClickColorScript()"); StringBuilder b=new StringBuilder(); b.append("\n\r "); return b.toString(); } /** * 对报配置的数据进行验证 * @return 验证通过,则返回空值,如果有错误,则返回错误信息。 */ public String toCheckReport(){ //验证最后行标题的列数与前面标题行的 列数相同 if(report==null) return "未正确配置报表参数。"; if(report.getTitle()==null || report.getColspan()==null || report.getRowspan()==null || report.getField()==null || report.getColWidth()==null || report.getDt()==null || report.getFormat()==null ){ return "未正确配置报表标题参数。检查title、colspan、rowspan、colWidth、format、dt有空值。"; } if(report.getTitle().length!=1){ //System.out.println(report.getTitle().length+"|"+report.getColspan().length+"|"+report.getRowspan().length); //System.out.println(report.getTitle()[0].length+"|"+report.getColspan()[0].length+"|"+report.getRowspan()[0].length); if(report.getTitle().length!=report.getColspan().length ||report.getTitle().length!=report.getRowspan().length ||report.getRowspan().length!=report.getColspan().length || report.getTitle()[0].length!=report.getColspan()[0].length ||report.getTitle()[0].length!=report.getRowspan()[0].length ||report.getRowspan()[0].length!=report.getColspan()[0].length ){ return "未正确配置报表标题参数。检查title、colspan、rowspan的数组长度"; } } if(report.getTitle()[0].length!=report.getField().length ||(report.getGroupField()!=null&&report.getGroupField().length!=report.getField().length) ||(report.getTotalField()!=null&&report.getTotalField().length!=report.getField().length) ||report.getColWidth().length!=report.getField().length ||report.getFormat().length!=report.getField().length ){ return "未正确配置报表标题参数。检查title、Field的数组长度"; } //验 证合并列,总合并列数不能大于所有字段数 for(int i=0;i1){ index=j+report.getColspan()[i][j]; flat=true; tcol+=report.getColspan()[i][j]; }else if(flat&&jreport.getRowspan().length){ return "未正确配置报表标题参数。检查合并行设置,合并行数不能大于标题总行数."; } if(report.getRowspan()[i][j]>1){ for(int k=i+1;k0?1:0; if(next>pages) next=pages; int pre=current-1; if(pre==0)pre=1; StringBuffer page=new StringBuffer(); page.append("
"); page.append("
    "); page.append("
  • "); if(current==1){ page.append(""); page.append(""); }else{ page.append(""); page.append(""); } int m=current-2; int e=current+2; if(m<=0)e+=(m*-1)+1; if(e>pages) m=current-2-(e-pages); for(int i=m;i<=e;i++){ if(i>0&&i<=pages){ page.append("").append(i).append(""); } } if(current!=pages){ page.append(""); page.append(""); }else{ page.append(""); page.append(""); } page.append("
  • "); page.append("
"); page.append("
"); page.append("共").append(total).append("条 "); page.append("共").append(pages).append("页"); page.append("每页显示 ").append(pageSize).append("条"); page.append("
"); page.append(""); page.append("
"); return page.toString(); } /** * 计算分页的开始数 和结束数 * @param pageSize * @param current * @return */ public int[] pageNumber(int pageSize,int current){ pageSize=pageSize<=0?100:pageSize; int start=(current-1) * pageSize; int end=current * pageSize; return new int[]{start,end}; } public Report getReport() { return report; } public void setReport(Report report) { this.report = report; } public static void main(String srt[]){ StringBuffer c=new StringBuffer(); c.append("YD_0145"); String cc="YD_0145"; if(!c.toString().equals(cc)){ System.out.println("-----------"); } StringBuffer body=new StringBuffer(); body.append("雷管12米普通毫秒导爆管雷管c1×100万发6-100.00000.00000.32000.00000.00000.32000.00000.00000.00000.0000 雷管12米普通毫秒导爆管雷管c 合计:       0.0 0.0 0.0 0.32 0.0 0.0 0.0 0.32 0.0 0.0 0.0 0.0 0.0 0.0 15米抗水毫秒导爆管雷管c1×1000) { body.replace(rowspan,rowspan+rspan.length(),rowspanNum);//替换成行数 } System.out.println("-----------"+body); } }