table表格实现按行拆分

Reading time ~33 minutes

此文章为原创文章,引用请标记文章出处: table表格实现按行拆分

1.要点

1.不用poi,因为不是操作excel;

2.表格会存在行合并,所有要进行拆分

2.思路

由于拆分的逻辑麻烦,所有先在前台把table的格式把<td>汇聚成一个json格式的数据块传到后台中用json工具去拆分

3.核心代码

前端js做处理把table数据以json格式返回

//获取table的数据,以Json的格式返回
function getJsonCopyData($iframe,hasHeader){
	//---------------1.获取table的内容
	var ke_zeroborder=$iframe.find('.ke-content').find('table').html();
	var txt = "[";
	var rowNums=$(ke_zeroborder).find('tr').length;

	//兼容了带表头的情况,但后台要特殊处理表头 TODO
	for (var j = 0 ; j < rowNums; j++) {
		var r ="";
		var trs=$(ke_zeroborder).find('tr')[j];
		//
		var $tds=$(trs).find('td');
		if($(trs).text()===""){//空行,表示存在这一行和上一行整行合并了
			continue;
		}
		r = "{";
		var index=0;//单独记录下一次key的数字,用于记录从table的body开始每一行的行数
		for (var i = 0; i < $tds.length;i++) {
			var currTd=$tds[i];
			var rowSpan="",colspan="";
			if(typeof($(currTd).attr("rowspan"))!="undefined"){
				rowSpan= "%(#"+$(currTd).attr("rowspan")+"#)%" ;
			}
			//把双引号转义,记录rowspan用于传到后台拆分
			r += "\"" + index + "\"\:\"" + ($(currTd).text().replace(/"([^"]*)"/g, "'$1'")).trim() +rowSpan+"\",";
			index++;
		}
		if($tds.length>0){
			r = r.substring(0, r.length - 1);
			r += "},";
			txt += r;
		}
	}
	txt = txt.substring(0, txt.length - 1);
	txt += "]";
	//去掉html的<br>标签
	return stripHTML(txt).replace(/\s+/g,"");
}

然后是java后台的相关代码

/**
inscfeeInfo:[{"0":"险种","1":"手续费率","2":"佣金净保费结算","3":"佣金全保费结算","4":"业务性质"},{"0":"商业险","1":"50.88%","2":"45.79%","3":"43.20%","4":"车价30万以下;非过户的非营业客车,交商共保%(#2#)%"},{"0":"交强险","1":"50.88%","2":"45.79%","3":"43.20%"},{"0":"单交强","1":"45.58%","2":"41.02%","3":"38.70%","4":"车价30万以下;非过户的非营业客车,单交强"},{"0":"单商业","1":"37.1%","2":"33.39%","3":"31.50%","4":"车价30万以下;非过户的非营业客车,单商业"},{"0":"商业险","1":"50.88%","2":"45.79%","3":"43.20%","4":"车价30万以下;过户的非营业客车:交商共保(不含车损)%(#2#)%"},{"0":"交强险","1":"50.88%","2":"45.79%","3":"43.20%"},{"0":"单交强","1":"45.58%","2":"41.02%","3":"38.70%","4":"车价30万以下;过户的非营业客车:单交强"}]
 **/
 JSONArray jsonArrays= JSON.parseArray(inscfeeInfo);
 int rowNum=jsonArrays.size();//行数,也是 粘贴的行数

 List<JSONObject> listObject=new ArrayList<>();
 //通过数组来保存每一个列的数据,数量就是行数
 for(int i=0;i<rowNum;i++){
	 JSONObject object= (JSONObject) jsonArrays.get(i);
	 listObject.add(object);
 }

 OptionalInt colNumInt=listObject.stream().mapToInt(JSONObject::size).max();//列数
 int colNum=colNumInt.orElse(1);
 String[] colName=new String[colNum];//列的名称
//单独获取表头的数据 和 获取不需要拼接的列号
 for(int i=0;i<colNum;i++){
	 String name=String.valueOf(listObject.get(0).get(i+""));
	 if(StringUtil.isNotEmpty(name)){
		 int rowspanIndex=name.indexOf("%(#");
		 if(rowspanIndex==-1){
			 colName[i]=name;
		 }else{
			 colName[i]=name.substring(0, rowspanIndex);
		 }
	 }
 }
 listObject.remove(0);//去掉表头
 rowNum-=1;//去掉表头所以行数减一

 int[] colIndexs=new int[rowNum];//记录每一行当前的列数
 //获取表的body数据
 for(int i=0;i<colNum;i++){
	 String [] col=new String[rowNum];
	 for(int rowIndex=0;rowIndex<rowNum;){
		 JSONObject object=listObject.get(rowIndex);//获取下一个的json对象
		 String jsonValue=(String) object.get(colIndexs[rowIndex]+"");//获取列的值
		 if(StringUtil.isEmpty(jsonValue)){
			 jsonValue="";
		 }
		 if(jsonValue.contains("%(#")&&jsonValue.contains("#)%")){//存在rowspan的属性,且符合规定的格式
			 String value=jsonValue.substring(0, jsonValue.indexOf("%(#"));;
			 String rowspanStr=jsonValue.substring(jsonValue.indexOf("%(#")+3,jsonValue.indexOf("#)%"));
			 int rowspan=Integer.parseInt(rowspanStr);
			 for(int k=rowIndex;k<rowIndex+rowspan;k++){
				 col[k]=value;
			 }
			 if(rowspan!=0){
				 colIndexs[rowIndex]++;
				 rowIndex=rowIndex+rowspan;
			 }
		 }else{
			col[rowIndex]=jsonValue;
			colIndexs[rowIndex]++;
			rowIndex++;
		 }
	 }
	 list.add(col);
 }

//行列转换,得到行完成的数据的列表
List<String[]> results=new ArrayList<>();
for(int i=0;i<rowNum;i++){
	String[] result=new String[colNum];
	for(int j=0;j<colNum;j++){
		result[j]=list.get(j)[i];
	}
	results.add(result);
}

jdk-timer、spring-task、quartz的比较

这篇文章将简单介绍目前常用的定时任务框架! Continue reading

小岛经济学-读书笔记

Published on May 10, 2018

java常见的http请求库

Published on May 05, 2018