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