使用net.sf.mpxj读取project的.mpp文件

使用net.sf.mpxj读取project的.mpp文件

码农世界 2024-06-18 后端 82 次浏览 0个评论

1、导入.mpp文件

public void importMppFile(String updateType, MultipartFile multipartFile) {
        try (InputStream inputStream = multipartFile.getInputStream()) {
            // 读取文件的组件
            MPPReader mppReader = new MPPReader();
            // 注意,如果在这一步出现了读取异常,肯定是版本不兼容,换个版本试试
            ProjectFile projectFile = mppReader.read(inputStream);
            // 从文件中获取的任务对象
            List tasks = 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(List taskList, 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
            mpxj
            10.14.1
        

转载请注明来自码农世界,本文标题:《使用net.sf.mpxj读取project的.mpp文件》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,82人围观)参与讨论

还没有评论,来说两句吧...

Top