poi合并单元格


使用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;
}

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM