使用java做表格的时候很多时候会出现一对多的情况,比如一个老师对多个学生,这个时候需要把一个的也就是老师合并。类似下图
我们使用poi来操作excel。流程
1.取出要导出的集合A
2.遍历结合A,将集合A中的一的一端(上图中老师 )作为key,要合并的单元格作为value,存入map中
3.给两个标志位 lineNum=0;用来记录要合并的行数
lineIndex=0;用来记录目前合并的是第几行
4.for(集合A){
取出集合A中的key,
if(lineNum=lineIndex){
判断集合A中的key在Map中是否存在(应该是都存在)
如果存在,lineNum=Map中的Value,否则为1
lineIndex=0; //重置LineIndex,后面判断这行数据是否要合并单元格,不需要的话Lindex++为1,这样lineNum=lineIndex都为1,从新走这个判断
}
if(lineNum==1){
不需要合并。
lineIndex++;
}else{
if( lineIndex=0){
合并列操作
lineIndex++ //下一次循环,lineIndex!=lineNum ,lineIndex不会重置为0,走下面 ,直到lineIndex=lineNum,进入新的循环。
}else{
lineIndex++
}
}
}
具体代码如下:
private Sheet createProRCApplyExpEND(Sheet sheet,XSSFCellStyle cellStyle) {
List <Object[]> obj = excelService.getParticular();
Map<Object, Integer> projLines = getLinesbyProId(obj);
Integer proLineNum = 0;
Integer lineIndex = 0;
for(int i=0; i<obj.size(); i++) {
Object proId = obj.get(i)[0];
//表示已经处理完了所有要合并的行
if(lineIndex.equals(proLineNum)) {
proLineNum = projLines.containsKey(proId) ? projLines.get(proId) : 1;
lineIndex = 0;
}
System.out.println("i="+i);
String proName = obj.get(i)[1]==null?"":obj.get(i)[1]+"";
String office = obj.get(i)[2]==null?"":dictItemService.getDictName("ccb.office", obj.get(i)[2].toString());
String manager = obj.get(i)[3]==null?"":obj.get(i)[3]+"";
String proType = obj.get(i)[4]==null?"":dictItemService.getDictName("project.type", obj.get(i)[4].toString());
String startDate = obj.get(i)[5]==null?"":obj.get(i)[5]+"";
String endDate = obj.get(i)[6]==null?"":obj.get(i)[6]+"";
String proStatus = obj.get(i)[7]==null?"":dictItemService.getDictName("project.status", obj.get(i)[7].toString());
String signNO = obj.get(i)[8]==null?"": String.valueOf(obj.get(i)[8]);
String signRMB = obj.get(i)[9]==null?"": String.valueOf(obj.get(i)[9]);
String conRMB= obj.get(i)[10]==null?"": String.valueOf(obj.get(i)[10]);
String applyRMB= obj.get(i)[11]==null?"": String.valueOf(obj.get(i)[11]);
String UsedRMB= obj.get(i)[12]==null?"": String.valueOf(obj.get(i)[12]);
String preUsedRMB= obj.get(i)[13]==null?"": String.valueOf(obj.get(i)[13]);
String endRMB= obj.get(i)[14]==null?"": String.valueOf(obj.get(i)[14]);
String remainRMB= obj.get(i)[15]==null?"": String.valueOf(obj.get(i)[15]);
sheet.createRow(1+i).createCell(0).setCellValue(proName);
sheet.getRow(1+i).createCell(1).setCellValue(office);
sheet.getRow(1+i).createCell(2).setCellValue(manager);
sheet.getRow(1+i).createCell(3).setCellValue(proType);
sheet.getRow(1+i).createCell(4).setCellValue(startDate);
sheet.getRow(1+i).createCell(5).setCellValue(endDate);
sheet.getRow(1+i).createCell(6).setCellValue(proStatus);
sheet.getRow(1+i).createCell(7).setCellValue(signNO);
sheet.getRow(1+i).createCell(8).setCellValue(signRMB);
sheet.getRow(1+i).createCell(9).setCellValue(conRMB);
sheet.getRow(1+i).createCell(10).setCellValue(applyRMB);
sheet.getRow(1+i).createCell(11).setCellValue(UsedRMB);
sheet.getRow(1+i).createCell(12).setCellValue(preUsedRMB);
if(proLineNum == 1) {
sheet.getRow(1 + i).createCell(13).setCellValue(endRMB);
sheet.getRow(1 + i).createCell(14).setCellValue(remainRMB);
lineIndex++;
}
//行数不等于1则要做合并
else{
if(lineIndex == 0){
//做单元格合并并添加数字
CellRangeAddress region = new CellRangeAddress(i + 1, i + proLineNum, 13, 13);
sheet.addMergedRegion(region);
sheet.getRow(1 + i).createCell(13).setCellValue(endRMB);
sheet.getRow(1 + i).getCell(13).setCellStyle(cellStyle);
region = new CellRangeAddress(i + 1, i + proLineNum, 14, 14);
sheet.addMergedRegion(region);
sheet.getRow(1 + i).createCell(14).setCellValue(remainRMB);
sheet.getRow(1 + i).getCell(14).setCellStyle(cellStyle);
lineIndex++;
}else{
//跳过,不做操作
lineIndex++;
}
}
}
return sheet;
}
存入map
private Map<Object,Integer> getLinesbyProId(List<Object[]> objs){
Map<Object,Integer> lines = new HashMap<Object,Integer>();
for(Object[] objArray : objs){
Object proId = objArray[0];
//原先存在则表示多加一行
if(lines.containsKey(proId)){
Integer num = lines.get(proId);
lines.put(proId,num+1);
}else{
//默认初始化是一行
lines.put(proId,1);
}
}
return lines;
}