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