1、导入.mpp文件
public void importMppFile(String updateType, MultipartFile multipartFile) { try (InputStream inputStream = multipartFile.getInputStream()) { // 读取文件的组件 MPPReader mppReader = new MPPReader(); // 注意,如果在这一步出现了读取异常,肯定是版本不兼容,换个版本试试 ProjectFile projectFile = mppReader.read(inputStream); // 从文件中获取的任务对象 Listtasks = projectFile.getChildTasks(); // 解析后数据存入对象 List importList = new ArrayList<>(); // 递归解析方法 parseTasks(tasks.get(0).getChildTasks(), new ProjectProgressEntity(), importList); } catch (Exception e) { e.printStackTrace(); } }
2、递归解析任务
/** * 递归解析任务 * * @param taskList 循环解析对象 * @param currentProjectProgress 当前循环的数据是它的子级 * @param importList 循环解析后数据存入的集合 */ private static void parseTasks(ListtaskList, ProjectProgressEntity currentProjectProgress, List importList) { // 设置层级,如果等于空,则代表是第一层级,不为空则在父级节点的层级基础上+1 int levelNum = currentProjectProgress.getPlanLevel() == null ? 1 : currentProjectProgress.getPlanLevel() + 1; // 循环所有节点 for (Task task : taskList) { ProjectProgressEntity projectProgress = new ProjectProgressEntity(); projectProgress.setProjectProgressId(UUID.fastUuid().toString()); projectProgress.setTaskId(task.getID()); projectProgress.setSerialNumber(task.getID()); projectProgress.setSplitParentId(currentProjectProgress.getSerialNumber()); projectProgress.setPlanLevel(levelNum); projectProgress.setTaskName(task.getName()); projectProgress.setDuration(task.getDuration().getDuration()); projectProgress.setPlanStartDate(task.getStart()); projectProgress.setPlanEndDate(task.getFinish()); projectProgress.setParentId(getParentIds(task)); // 获取实际开始时间和实际结束时间的值 projectProgress.setActualStartDate(task.getActualStart()); projectProgress.setActualEndDate(task.getActualFinish()); // 获取任务完成进度百分比 projectProgress.setProgress(BigDecimal.valueOf((Double) task.getPercentageComplete())); // 获取任务的资源集合 projectProgress.setPersonInCharge(MppFileUtils.getResource(task)); // 获取任务状态、开始告警、结束告警的状态 buildTaskStatus(task.getActualStart(), task.getActualFinish(), projectProgress); buildStartAlert(task.getStart(), task.getActualStart(), projectProgress); buildEndAlert(task.getFinish(), task.getActualFinish(), projectProgress); // 判断是否有子任务 if (task.getChildTasks().size() > 0) { projectProgress.setIsNotSplit("0"); // 继续进行递归,当前保存的只是父任务的信息 parseTasks(task.getChildTasks(), projectProgress, importList); } else { projectProgress.setIsNotSplit("1"); } importList.add(projectProgress); } }
3. 获取资源名称:MppFileUtils类的getResource方法
/** * 获取资源名称 * * @param task 任务 * @return 资源名称 */ public static String getResource(Task task) { StringBuffer buf = new StringBuffer(); List assignments = task.getResourceAssignments(); for (int i = 0; i < assignments.size(); i++) { ResourceAssignment assignment = (ResourceAssignment) assignments.get(i); Resource resource = assignment.getResource(); if (resource != null) { buf.append(resource.getName()); // 如果不是最后一个资源,就添加逗号 if (i < assignments.size() - 1) { buf.append(","); } } } return buf.toString(); }
4.引入依赖:解析project的.mpp文件
net.sf.mpxj mpxj10.14.1
还没有评论,来说两句吧...