//存放数据的二维集合,twoDimensional 中每个List是树状结构的一个分支的所有数据List<List<JSONObject>> twoDimensional = new ArrayList<>();//创建对象XSSFWorkbook xwb = new XSSFWorkbook();//创建工作表Sheet sheet = xwb.createSheet("统计");//动态创建首行表头Row firstRow = sheet.createRow(0);JSONObject cm = new JSONObject(columnMap);for (int i = 0; i < tier+keys.size(); i++) {Cell cell = firstRow.createCell(i);if (i<tier){String s="一";switch (i){case 1 : s="二";break;case 2 : s="三";break;}cell.setCellValue(s+"级分类");}else {cell.setCellValue(cm.getString(keys.get(i - tier)));}}
绘制完表头如下:
//动态绘制数据,tier是层级数,根据业务最多三级for (int i = 0; i < twoDimensional.size(); i++) {Row row = sheet.createRow(i+1);List<JSONObject> list = twoDimensional.get(i);for (int j = 0; j < keys.size()+tier; j++) {Cell cell = row.createCell(j);if (j<tier){//绘制层级标签if (j==0){JSONObject jsonObject = list.get(tier - 1);cell.setCellValue(jsonObject.getString("dictLabel"));continue;}if (j==1){Map map = list.get(tier - 2);cell.setCellValue((String)map.get("dictLabel"));continue;}if (j==2){Map map = list.get(tier - 3);cell.setCellValue((String)map.get("dictLabel"));continue;}}else {//绘制层级的数据JSONObject bean = new JSONObject(list.get(0));cell.setCellValue(bean.getString(keys.get(j - tier)));}}}//添加总合计行,并合并单元格Row totalRow = sheet.createRow(twoDimensional.size()+1);for (int j = 0; j < keys.size()+tier; j++) {Cell cell = totalRow.createCell(j);if (j<tier){cell.setCellValue("合计");}else {cell.setCellValue(topBean.getString(keys.get(j - tier)));}}if (tier != 1){sheet.addMergedRegion(new CellRangeAddress(twoDimensional.size()+1,twoDimensional.size()+1,0,tier-1));}
添加数值后如下:
//合并相同的单元格int lastRowNum = sheet.getLastRowNum();int index = 0;//根据业务只有标签这几列需要合并for (int i = 0; i < tier-1; i++) {//比较相邻cell的值是否相同,并记录for (int j = 0; j < lastRowNum; j++) {Row row = sheet.getRow(j);Cell cell = row.getCell(i);String stringCellValue = cell.getStringCellValue();if ("合计".equals(stringCellValue)){sheet.addMergedRegion(new CellRangeAddress(j,j,i,i+1));continue;}Row nextRow = sheet.getRow(j+1);Cell nextcell = nextRow.getCell(i);String nextStringCellValue = nextcell.getStringCellValue();if (stringCellValue.equals(nextStringCellValue)){if (j+1 == lastRowNum){if (index != 0){sheet.addMergedRegion(new CellRangeAddress(j-index,j+1,i,i));index = 0;}}else {index++;}}else {if (index != 0){sheet.addMergedRegion(new CellRangeAddress(j-index,j,i,i));index = 0;}}}}return xwb;
合并后最终如下: