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);
}