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(" <table class='htmlReport' id='bill' cellspacing='0' cellpadding='0' border='0' style='width:").append(report.getWidth()==0?"100%":report.getWidth()+"px").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("</table>");
|
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("<script type='text/javascript'>");
|
// if(report.getWidth()>0){
|
// html.append("document.getElementById('div_form_body').style.width='").append(report.getWidth()).append("px';");
|
// }
|
// html.append("</script>");
|
//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("<script type='text/javascript'>");
|
html.append("init();");
|
html.append("</script>");
|
return html.toString();
|
}
|
/**
|
* 固定表头
|
* @return
|
*/
|
private String[] fixHeader(){
|
StringBuffer html=new StringBuffer();
|
html.append(" <div class='table-head' id='headdiv'>");
|
html.append(" <table class='htmlReport' id='bill' cellspacing='0' cellpadding='0' border='0' style='width:").append(report.getWidth()==0?"100%":report.getWidth()+"px").append("'>");
|
// html.append(" <colgroup>");
|
// html.append(" <col style='width: 80px;'><col style='width: 300px;'><col>");
|
// html.append(" </colgroup>");
|
String colgroup=createFixTitleColgroup();
|
html.append(colgroup);
|
html.append(" <thead>");
|
//html.append(" <tr><th>序号</th><th>内容</th><th>内容</th></tr>
|
html.append(createTitleNew());
|
html.append(" </thead>");
|
html.append(" </table>");
|
html.append(" </div>");
|
html.append(" <div class='table-body' id='bodydiv'> ");
|
return new String[]{html.toString(),colgroup,"</div>"};
|
|
}
|
/**
|
* 创建标题栏,多级标题,支持合并标题 6.5
|
* @return
|
*/
|
private String createFixTitleColgroup(){
|
StringBuffer title=new StringBuffer();
|
title.append("<colgroup>");
|
if(report.getTitle()!=null){
|
//int width[]=new int[report.getTitle()[report.getTitle().length-1].length];//最后一行
|
int width[]=report.getColWidth();
|
// for(int i=0;i<report.getTitle().length;i++ ){//多级表头
|
// for(int j=0;j<report.getTitle()[i].length;j++){//每一列标题
|
// if(report.getRowspan()[i][j]>0&&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("<col style='width:").append(width[i]).append("%'>");
|
// else
|
// title.append("<col>");
|
}
|
}
|
title.append("</colgroup>");
|
return title.toString();
|
}
|
public String getReportTitle(){
|
StringBuffer html=new StringBuffer();
|
html.append(" <table class='htmlReport' id='bill' cellspacing='0' cellpadding='0' border='0' style='width:").append(report.getWidth()==0?"100%":""+report.getWidth()).append("px'>");
|
html.append(createTitleNew());
|
html.append("</table>");
|
return html.toString();
|
|
}
|
public String getTableHeader(){
|
StringBuffer html=new StringBuffer();
|
html.append(" <table class='htmlReport' id='bill' cellspacing='0' cellpadding='0' border='0' style='width:").append(report.getWidth()==0?"100%":""+report.getWidth()).append("px'>");
|
html.append(createTitleNewForShow());
|
html.append("</table>");
|
return html.toString();
|
}
|
/**
|
* 创建标题栏,多级标题,支持合并标题 6.5
|
* @return
|
*/
|
private String createTitleNewForShow(){
|
StringBuffer title=new StringBuffer();
|
// title.append("<tHead>");
|
if(report.getTitle()!=null){
|
for(int i=0;i<report.getTitle().length;i++ ){//多级表头
|
// title.append(" <tr id='titletr").append(i+1).append("' onClick='selectAllRowCheckbox(this)'>");
|
title.append(" <tr bordercolor='#CCCCCC' align='center' height='26px' class='table_tr_head styleBgColor styleBorderColor'>");
|
for(int j=0;j<report.getTitle()[i].length;j++){//每一列标题
|
if(report.getRowspan()[i][j]>0&&report.getColspan()[i][j]>0){ //被合并的行可列 设置为0
|
title.append(" <th align='center' rowspan='").append(report.getRowspan()[i][j])
|
.append("' colspan='").append(report.getColspan()[i][j])
|
.append("' class='VLocked styleBgColor styleBorderColor' style='text-align:center;BORDER:#CCCCCC 1px solid;width:").append(computeTitleColWidth(i,j)).append("%'>")
|
.append(report.getTitle()[i][j]).append("</th>");
|
}
|
}
|
title.append(" </tr>");
|
}
|
}
|
//System.out.println("title:"+title.toString());
|
// title.append("</tHead>");
|
return title.toString();
|
}
|
/**
|
* 创建标题栏,多级标题,支持合并标题 6.5
|
* @return
|
*/
|
private String createTitleNew(){
|
StringBuffer title=new StringBuffer();
|
// title.append("<tHead>");
|
if(report.getTitle()!=null){
|
for(int i=0;i<report.getTitle().length;i++ ){//多级表头
|
// title.append(" <tr id='titletr").append(i+1).append("' onClick='selectAllRowCheckbox(this)'>");
|
title.append(" <tr bordercolor='#CCCCCC' align='center' height='26px' class='table_tr_head styleBgColor styleBorderColor'>");
|
for(int j=0;j<report.getTitle()[i].length;j++){//每一列标题
|
if(report.getRowspan()[i][j]>0&&report.getColspan()[i][j]>0){ //被合并的行可列 设置为0
|
title.append(" <th align='center' rowspan='").append(report.getRowspan()[i][j])
|
.append("' colspan='").append(report.getColspan()[i][j])
|
.append("' class='VLocked styleBgColor styleBorderColor' style='text-align:center;BORDER:#CCCCCC 1px solid;width:").append(computeTitleColWidth(i,j)).append("%'>")
|
.append(report.getTitle()[i][j]).append("</th>");
|
}
|
}
|
title.append(" </tr>");
|
}
|
}
|
//System.out.println("title:"+title.toString());
|
// title.append("</tHead>");
|
return title.toString();
|
}
|
|
/**
|
* 创建标题栏,多级标题,支持合并标题
|
* @return
|
*/
|
private String createTitle(){
|
StringBuffer title=new StringBuffer();
|
title.append("<tHead>");
|
if(report.getTitle()!=null){
|
for(int i=0;i<report.getTitle().length;i++ ){//多级表头
|
title.append(" <tr bordercolor='#CCCCCC' id='titletr").append(i+1).append("' onClick='selectAllRowCheckbox(this)'>");
|
for(int j=0;j<report.getTitle()[i].length;j++){//每一列标题
|
if(report.getRowspan()[i][j]>0&&report.getColspan()[i][j]>0){ //被合并的行可列 设置为0
|
title.append(" <td align='center' rowspan='").append(report.getRowspan()[i][j])
|
.append("' colspan='").append(report.getColspan()[i][j])
|
.append("' style='background:url(/com/report/img/thead_bg_tt.jpg);' width='").append(computeTitleColWidth(i,j)).append("%'>")
|
.append(report.getTitle()[i][j]).append("</td>");
|
}
|
}
|
title.append(" </tr>");
|
}
|
|
}
|
title.append("</tHead>");
|
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<titleCol;i++){//
|
startColIndex+=report.getColspan()[titleRow][i];
|
}
|
endColIndex=startColIndex+colspan;
|
for(int i=startColIndex;i<endColIndex;i++){
|
width+=report.getColWidth()[i];
|
}
|
|
return width;
|
}
|
/**
|
* 创建统计主要内容
|
* @return
|
* @throws BaseException
|
*/
|
private String createBody() throws BaseException{
|
StringBuffer body=new StringBuffer();
|
//记录分组字段的合计值
|
Map<String,double[]> 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("<tbody>");
|
//logger.error("总行:"+report.getDt().getRow());
|
for(int i=0;report.getDt()!=null&& i<report.getDt().getRows();i++){
|
FieldSetEntity f=report.getDt().getFieldSetEntity(i);
|
//--------merge------------
|
String group[]=oldGroupValue.clone();
|
//--------merge------------
|
body.append(createTotalRow(i,totalValue,oldGroupValue,groupIndex,groupRow,f,false,body));
|
|
body.append("<tr name='trs").append(i).append("' id='trs").append(i).append("' class='scrollColThead' bordercolor='#CCCCCC'>");
|
StringBuffer groupv=new StringBuffer();
|
for(int j=0;j<report.getField().length;j++){
|
|
Object value=f.getValue(report.getField()[j]);
|
//--------merge------------
|
if(j<=report.getMaxGroupFieldIndex()){
|
if(groupv.length()>0)groupv.append("_");
|
groupv.append(value==null?"":value);
|
}
|
|
if(j<=report.getMaxGroupFieldIndex() && groupv.toString().equals(group[j]) ) //当前分组字段值与前一条数据的同一分组字段的不相等,表示要分组合计
|
{
|
continue; //分组字段,如是不是第一条,不生成td
|
}
|
//-------------------------
|
body.append("<td class='all_biaodan_td' align='center' height='28px' id='").append(report.getField()[j]).append(i).append("'");
|
if(j<=report.getMaxGroupFieldIndex() && !groupv.toString().equals(group[j]) ) //当前分组字段值与前一条数据的同一分组字段的不相等,表示要分组合计
|
{
|
body.append(" rowspan='").append(report.getField()[j]).append(i).append("'");//占多少行
|
}
|
body.append(" width='").append( report.getColWidth()[j]).append("%'")//列宽
|
.append(" style='BACKGROUND-COLOR:#FFFFFF;text-align:")
|
.append(report.getAligh()==null||report.getAligh()[j]==null?"center":report.getAligh()[j])
|
.append("; '>");
|
if(report.getUrl()!=null&&report.getUrl()[j]!=null){
|
body.append("<a href='#this' onclick='show(\"").append(urlReplaceParameter(report.getUrl()[j],f)).append("\",this)'>");// 穿 透查询地址
|
}
|
body.append(value==null?"":formatData(value,j));//值
|
if(report.getUrl()!=null&&report.getUrl()[j]!=null){
|
body.append("</a>");
|
}
|
body.append("</td>\r\n");
|
|
if(report.getTotalField()!=null && report.getTotalField()[j]){//合计字段
|
toAddTotalValue(totalValue,j,f.getDouble(report.getField()[j]),"SUM");//分组字段的合计,在不同的组时,会清空
|
}
|
|
}
|
|
body.append("</tr>");
|
}
|
//最后一行后面再生成统计
|
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("</tbody>");
|
//最后生成 合并行javascript脚本
|
for(int k=0;report.getMaxGroupFieldIndex()>=0&&k<groupRow.length;k++){
|
for(int m=0;m<=report.getMaxGroupFieldIndex();m++){
|
//如果只有一条数据,不用添加分组字段
|
if(groupRow[k][m]<=1) continue;
|
if(rowSpan.length()>0)rowSpan.append("~");
|
//行下标=字段名+行下标=合并行数=列下标
|
rowSpan.append(k).append("=").append(report.getField()[m]).append(k).append("=").append(groupRow[k][m]).
|
append("=").append(m);
|
}
|
}
|
body.append("<input type='hidden' value='").append(rowSpan).append("' id='mergeRows'>");
|
body.append("<input type='hidden' value='").append(report.getMaxGroupFieldIndex()).append("' id='maxGroupFieldindex'>");
|
if(report.isShowTotalRow()){
|
body.append("<input type='hidden' value='true' id='isShowmergeRows'>");
|
}
|
//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<String,double[]> totalValue){
|
StringBuffer total=new StringBuffer();
|
double tv[]=(double[])totalValue.get("all");
|
if(report.getTotalField()!=null){
|
total.append("<tr class='scrollColThead' bordercolor='#CCCCCC'>");
|
int v=0;
|
boolean b=true;
|
for(int i=0;i<report.getField().length;i++){
|
if(report.getTotalField()[i]){
|
b=false;
|
total.append("<td class='all_biaodan_td' align='center' width='").append( report.getColWidth()[i])//列宽
|
.append("%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:")
|
.append(report.getAligh()==null||report.getAligh()[i]==null?"center":report.getAligh()[i])
|
.append("; '> ")
|
.append(formatData(tv[i],i))//值
|
.append("</td>");
|
}else if(i==0){
|
total.append("<td colspan='[total]' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center'>总计:</td>");
|
v++;
|
}else if(!b){
|
total.append("<td > </td>");
|
}else {
|
v++;
|
}
|
}
|
total.append("</tr>");
|
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<String,double[]> 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("<tr name='trs00").append(groupIndex[c]).append(c).append("' id='trs00").append(groupIndex[c]).append(c).append("' class='scrollColThead' bordercolor='#CCCCCC'>");
|
colspan=report.getMaxGroupFieldIndex()-c+1;
|
temp.append(" <td name='merg' colspan=")
|
.append(colspan).append(" style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:")
|
.append(report.getAligh()==null||report.getAligh()[c]==null?"center":report.getAligh()[c])
|
.append(";'>")
|
.append(oldGroupValue[c])
|
.append(" 合计:</td>");
|
//循环分组字段后的数据统计字段
|
for(int k=report.getMaxGroupFieldIndex()+1;k<report.getField().length;k++){
|
if(report.getTotalField()!=null&&report.getTotalField()[k]){//如果统计字段,显示合计值,否则显示空格
|
double tv[]=(double[])totalValue.get(report.getField()[c]);
|
temp.append(" <td align='center' width='").append(report.getColWidth()[k]).append("%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:")
|
.append(report.getAligh()==null||report.getAligh()[c]==null?"center":report.getAligh()[c])
|
.append(";'>").append(formatData(tv[k],k)).append("</td>");
|
}else{
|
temp.append(" <td align='center' width='").append(report.getColWidth()[k]).append("%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:")
|
.append(report.getAligh()==null||report.getAligh()[c]==null?"center":report.getAligh()[c])
|
.append(";'> </td>");
|
}
|
temp.append("\r\n");
|
}
|
temp.append(" </tr>");
|
//合计行结束
|
//同时当前分组前面的分组字段的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<String,double[]> m,int index,Double d,String type){
|
Iterator<String> 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 <String,double[]> initTotal(){
|
Map <String,double[]> m=new HashMap<String,double[]>();
|
for(int i=0;report.getGroupField()!=null&&i<report.getGroupField().length;i++){
|
if(report.getGroupField()[i]){
|
m.put(report.getField()[i],new double[report.getField().length]);
|
}
|
}
|
m.put("all", new double[report.getField().length]);//全部合计
|
return m;
|
}
|
/**
|
* URL设置中含变量参数的,用查出来值替换
|
* @param url
|
* @param f
|
* @return
|
*/
|
private String urlReplaceParameter(String url,FieldSetEntity f) throws BaseException{
|
int index=-1;
|
while((index=url.indexOf("~"))>=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("<script type='text/javascript'>\n\r");
|
b.append("window.onload=function(){\n\r");
|
//-----------------------------------
|
b.append("rowSelectedColor();//对每行初始关颜色变化的事件方法\n\r");
|
if(report.getOnloadMethod()!=null)b.append(report.getOnloadMethod());
|
b.append("\n\r");
|
b.append("alert(22);\n\r");
|
//-----------------------------------
|
b.append("}\n\r");
|
b.append("</script>\n\r");
|
return b.toString();
|
}
|
/**
|
* 添加数据行选中颜色变化的javascript 代码
|
* @return
|
*/
|
public String rowClickColorScript(){
|
//System.out.println("-----------------------进入 rowClickColorScript()");
|
StringBuilder b=new StringBuilder();
|
b.append("<script type='text/javascript'>\n\r");
|
//行添加事件
|
b.append("function rowSelectedColor(){\n\r");
|
b.append("var trs=document.getElementsByName('trs');\n\r");
|
b.append("for(var i=0;i<trs.length;i++){\n\r");
|
b.append("trs[i].onmouseover='changeActiveRow(this)';\n\r");
|
b.append("trs[i].onclick='changeActiveRow(this)';\n\r");
|
b.append("trs[i].onmousehover='changeActiveRow(this)';\n\r");
|
b.append("alert(i);\n\r");
|
b.append("}\n\r");
|
b.append("}\n\r");
|
|
//----------------------------------------
|
b.append("var currentActiveRow; //当前活动行\n\r");
|
b.append("//改变选中行的颜色\n\r");
|
b.append("function changeActiveRow(obj) {\n\r");
|
b.append("if (currentActiveRow) {\n\r");
|
b.append("currentActiveRow.style.backgroundColor = '';\n\r");
|
b.append("}\n\r");
|
b.append("currentActiveRow = obj;\n\r");
|
b.append("currentActiveRow.style.backgroundColor = '#F2F2F2';\n\r");
|
b.append("}\n\r");
|
b.append("</script>\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;i<report.getColspan().length;i++){
|
if(report.getColspan()[0][0]<=0){
|
return "未正确配置报表标题参数。检查合并列设置,第一个数字不能小于等于0.";
|
}
|
boolean flat=false;
|
int index=0;
|
int tcol=0;
|
for(int j=0;j<report.getColspan()[i].length;j++){
|
if(report.getColspan()[i][j]>1){
|
index=j+report.getColspan()[i][j];
|
flat=true;
|
tcol+=report.getColspan()[i][j];
|
}else if(flat&&j<index&&report.getColspan()[i][j]!=0){
|
|
return "未正确配置报表标题参数。检查合并列设置,合并列后面需设置合并列数等同的0。";
|
}else{
|
tcol+=report.getColspan()[i][j];
|
flat=false;
|
index=0;
|
}
|
}
|
// if(tcol != report.getField().length){
|
// return "未正确配置报表标题参数。检查总合并列数需与总字段数相等。";
|
// }
|
}
|
//验 证合行
|
for(int i=0;i<report.getRowspan().length;i++){
|
|
for(int j=0;j<report.getRowspan()[i].length;j++){
|
if(i==0&&j==0&&report.getRowspan()[i][j]<=0){
|
return "未正确配置报表标题参数。检查合并行设置,第一个行合并行数必须大于等于1.";
|
}
|
if(report.getRowspan()[i][j]>report.getRowspan().length){
|
return "未正确配置报表标题参数。检查合并行设置,合并行数不能大于标题总行数.";
|
}
|
if(report.getRowspan()[i][j]>1){
|
for(int k=i+1;k<report.getRowspan().length;k++){
|
if(report.getRowspan()[k][j]!=0){
|
return "未正确配置报表标题参数。检查合并行设置,被合并行的合并列必须为0.";
|
}
|
}
|
}
|
}
|
}
|
int width=0;
|
for(int i=0;i<report.getColWidth().length;i++){
|
width+=report.getColWidth()[i];
|
}
|
if(width!=100){
|
return "未正确配置报表标题参数。检查列宽度,列宽度合计等于100。";
|
}
|
return null;
|
}
|
/**
|
* 生成分页代码
|
* @return
|
*/
|
public String toPageHtml(int total,int current,int pageSize){
|
if(current==0)current=1;
|
int next=current+1;
|
pageSize=pageSize<1?100:pageSize;
|
int pages=total/pageSize;
|
pages+=(total%pageSize)>0?1:0;
|
if(next>pages) next=pages;
|
int pre=current-1;
|
if(pre==0)pre=1;
|
|
StringBuffer page=new StringBuffer();
|
page.append("<div class=\"pageBg clearfix\" style=\"bottom: 0; z-index: 99\"> ");
|
page.append("<ul class=\"page fl\">");
|
page.append("<li> ");
|
if(current==1){
|
page.append("<a tabindex=\"-1\" href=\"#this\" title=\"首页\" class=\"styleBorderColor disable_gray\"><span class=\"fe-font icon-036\"></span></a>");
|
page.append("<a tabindex=\"-1\" href=\"#this\" title=\"上一页\" class=\"styleBorderColor disable_gray\"><span class=\"fe-font icon-032\"></span></a>");
|
}else{
|
page.append("<a tabindex=\"-1\" href=\"#this\" class=\"styleBorderColor styleHoverLightBgColor\" title=\"首页\" onclick=\"JumpToPageNew('1')\"><span class=\"fe-font icon-036\"></span></a>");
|
page.append("<a tabindex=\"-1\" href=\"#this\" class=\"styleBorderColor styleHoverLightBgColor\" title=\"上一页\" onclick=\"JumpToPageNew('").append(pre).append("')\"><span class=\"fe-font icon-032\"></span></a>");
|
}
|
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("<a tabindex=\"-1\" href=\"#this\" class=\"styleBorderColor ").append(i==current?"btn_on":"").append(" styleBgColor styleHoverLightBgColor\"").append(" onclick=\"JumpToPageNew('").append(i).append("')\">").append(i).append("</a>");
|
}
|
}
|
if(current!=pages){
|
page.append("<a tabindex=\"-1\" href=\"#this\" class=\"styleBorderColor styleHoverLightBgColor\" title=\"下一页\" onclick=\"JumpToPageNew('").append(next).append("')\"><span class=\"fe-font icon-033\"></span></a>");
|
page.append("<a tabindex=\"-1\" href=\"#this\" class=\"styleBorderColor styleHoverLightBgColor\" title=\"尾页\" onclick=\"JumpToPageNew('").append(pages).append("')\"><span class=\"fe-font icon-037\"></span></a>");
|
}else{
|
page.append("<a tabindex=\"-1\" title=\"下一页\" class=\"styleBorderColor disable_gray\"><span class=\"fe-font icon-033\"></span></a>");
|
page.append("<a tabindex=\"-1\" title=\"尾页\" class=\"styleBorderColor disable_gray\"><span class=\"fe-font icon-037\"></span></a>");
|
}
|
page.append("</li>");
|
page.append("</ul>");
|
page.append("<div class=\"fr page_num\">");
|
page.append("<span class=\"fl\">共").append(total).append("条</span> ");
|
page.append("<span class=\"fl\">共").append(pages).append("页</span>");
|
page.append("<span class=\"fl\" id=\"pageShowCountLabel\">每页显示 ").append(pageSize).append("条</span>");
|
page.append("</div>");
|
page.append("<input type=\"hidden\" id=\"current\" name=\"current\" />");
|
page.append("</div>");
|
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("<tbody><tr id='trs0' class='scrollColThead' bordercolor='#CCCCCC'><td class='all_biaodan_td' align='center' height='28px' id='商品分类0' rowspan='SG05415' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>雷管</td><td class='all_biaodan_td' align='center' height='28px' id='商品名称0' rowspan=1称' width='10%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>12米普通毫秒导爆管雷管c</td><td class='all_biaodan_td' align='center' height='28px' id='规格型号0' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>1×100</td><td class='all_biaodan_td' align='center' height='28px' id='计量单位0' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>万发</td><td class='all_biaodan_td' align='center' height='28px' id='段别0' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '><a href='#this' onclick='show(\"12米普通毫秒导爆管雷管c,6-10\")'>6-10</a></td><td class='all_biaodan_td' align='center' height='28px' id='月初合计0' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>0.0000</td><td class='all_biaodan_td' align='center' height='28px' id='月初90' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>0.0000</td><td class='all_biaodan_td' align='center' height='28px' id='月初100' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '></td><td class='all_biaodan_td' align='center' height='28px' id='累计入库0' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>0.3200</td><td class='all_biaodan_td' align='center' height='28px' id='本月入库0' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>0.0000</td><td class='all_biaodan_td' align='center' height='28px' id='累计入库90' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>0.0000</td><td class='all_biaodan_td' align='center' height='28px' id='累计入库100' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '></td><td class='all_biaodan_td' align='center' height='28px' id='累计出库0' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>0.3200</td><td class='all_biaodan_td' align='center' height='28px' id='本月出库0' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>0.0000</td><td class='all_biaodan_td' align='center' height='28px' id='累计出库90' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>0.0000</td><td class='all_biaodan_td' align='center' height='28px' id='累计出库100' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '></td><td class='all_biaodan_td' align='center' height='28px' id='月末合计0' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>0.0000</td><td class='all_biaodan_td' align='center' height='28px' id='月末90' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>0.0000</td><td class='all_biaodan_td' align='center' height='28px' id='月末100' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '></td></tr> <td name='merg' colspan=1 style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>雷管12米普通毫秒导爆管雷管c 合计:</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'> </td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'> </td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'> </td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.32</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.32</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> <td align='center' width='5%' style='color:#4682B4;BACKGROUND-COLOR:#FFFFFF;text-align:center;'>0.0</td> </tr><tr class='scrollColThead' bordercolor='#CCCCCC'><tr id='trs1' class='scrollColThead' bordercolor='#CCCCCC'><td class='all_biaodan_td' align='center' height='28px' id='商品名称1' rowspan=1称' width='10%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>15米抗水毫秒导爆管雷管c</td><td class='all_biaodan_td' align='center' height='28px' id='规格型号1' width='5%' style='BACKGROUND-COLOR:#FFFFFF;text-align:center; '>1×100</td><td class='all_biaodan_td' align='center' height='28px' id='计量单位1'");
|
String field="SG054";
|
int index=15;
|
int groupRow=10;
|
String rspan="rowspan='"+field+index+"'";
|
String rowspanNum="rowspan='"+ groupRow +"'";
|
int rowspan=body.indexOf(rspan);
|
if(rowspan>0) {
|
body.replace(rowspan,rowspan+rspan.length(),rowspanNum);//替换成行数
|
}
|
System.out.println("-----------"+body);
|
}
|
}
|