@RequestMapping(value = "downloadTaskListExcel", method = RequestMethod.GET) public void downloadTaskListExcel(String projectNo, HttpServletResponse response) { if (!StringUtils.isEmpty(projectNo)) { ProjectInfo projectInfoQuery = new ProjectInfo(); projectInfoQuery.setProjectNo(projectNo); ProjectInfo projectInfo = projectInfoService.get(projectInfoQuery); List<ConstPlan> constPlans = constPlanService.findPlanNameAndTaskStatusAndIocName(projectNo); Workbook workbook = projectInfoService.createTaskListExcel(constPlans); try { String fileName = projectInfo.getProjectName() + "-任务清单模板.xls"; fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1"); response.setContentType("application/octet-stream"); response.setHeader("Content-disposition", "attachment;filename=" + fileName); response.flushBuffer(); workbook.write(response.getOutputStream()); } catch (Exception e) { e.printStackTrace(); } } }
public abstract Workbook createTaskListExcel(List<ConstPlan> constPlans);
@Override public Workbook createTaskListExcel(List<ConstPlan> constPlans) { HSSFWorkbook workbook = new HSSFWorkbook(); HSSFCellStyle headerStyle = (HSSFCellStyle) workbook.createCellStyle(); HSSFFont headerFont = (HSSFFont) workbook.createFont(); // 创建字体样式 headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); // 字体加粗 headerStyle.setFont(headerFont); // 为标题样式设置字体样式 headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); // 下边框 headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);// 左边框 headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);// 上边框 headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);// 右边框 Map<String, List<ConstPlan>> map = new LinkedHashMap<>(); for (ConstPlan constPlan : constPlans) { if (map.containsKey(constPlan.getParentId())) { List<ConstPlan> target = map.get(constPlan.getParentId()); target.add(constPlan); map.put(constPlan.getParentId(), target); } else { List<ConstPlan> target = new ArrayList<>(); target.add(constPlan); map.put(constPlan.getParentId(), target); } } System.out.println(JSON.toJSON(map)); // 获取当前 map中的所有的key 值 for (String string : map.keySet()) { //根据相应的id 来查出相应的上级计划的信息 ConstPlan system = constPlanRepo.get(new ConstPlan(string)); //以相应的计划名称生成相应的表单 HSSFSheet sheet = workbook.createSheet(system.getName()); //根据相应的一级计划查询出该计划下面所有的二级计划 List<ConstPlan> childs = constPlanRepo.getChild(system.getId()); //第一行的列名就是根据拼接以及查询出来的需要展示的信息名称 List<String> headers = getHeads(childs); //根据相应的key值查询出当前的value 值 List<ConstPlan> mapValue = map.get(string); //创建第一行 HSSFRow row = sheet.createRow(0); for (int i = 0; i < headers.size(); i++) { //设置第一行中的单元格内容 HSSFCell cell = row.createCell(i); //获取出 当前list 中拼接的第(i+1)个元素,因为循环是从0开始的 //把对应的 key 对应的 value 值转换成Excel 中的String 类型. HSSFRichTextString text = new HSSFRichTextString(headers.get(i)); //设置出当前单元格的格式 cell.setCellStyle(headerStyle); //设置当前单元格的value 值 cell.setCellValue(text); } //查询出当前key 中的计划中的点位名称 List<String> taskNames = getTaskName(mapValue); for (int i = 0; i < taskNames.size(); i++) { //根据查询出来的条数来生成行数 HSSFRow rowN = sheet.createRow(i + 1); //生成的行数的第一个单元格填写入相应的序号数 rowN.createCell(0).setCellValue(i + 1); //生成的行数的第二个单元格填入相应的点位名称 rowN.createCell(1).setCellValue(taskNames.get(i)); //下面的从第3个单元格开始 for (int j = 2; j < headers.size(); j++) { //生成单元格 HSSFCell cell = rowN.createCell(j); //对当前的key 下面的list 集合进行遍历 for (ConstPlan constPlan : mapValue) { //如果当前列名与计划名相等 if (headers.get(j).equals(constPlan.getName())) { //得到这个计划中的所有任务 List<ConstTask> constTasks = constPlan.getConstTasks(); // cell.setCellValue("X"); for (ConstTask constTask : constTasks) { //如果任务的名称与点位名称相等 if (taskNames.get(i).equals(constTask.getName())) { // cell.setCellValue(getValue(constTask.getStatus())); cell.setCellValue(constTask.getStatus()); break; } } break; } } } } } return workbook; }
private List<String> getTaskName(List<ConstPlan> list) { List<String> locNames = new ArrayList<>(); for (ConstPlan constPlan : list) { for (ConstTask constTask : constPlan.getConstTasks()) { if (!locNames.contains(constTask.getName())) { locNames.add(constTask.getName()); } } } return locNames; }
private List<String> getHeads(List<ConstPlan> constPlans) { List<String> headers = new ArrayList<>(); headers.add("序号"); headers.add("任务点位"); for (ConstPlan constPlan : constPlans) { headers.add(constPlan.getName()); } return headers; }