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

1、导入.mpp文件

public void importMppFile(String updateType, MultipartFile multipartFile) {
        try (InputStream inputStream = multipartFile.getInputStream()) {
            // 读取文件的组件
            MPPReader mppReader = new MPPReader();
            // 注意,如果在这一步出现了读取异常,肯定是版本不兼容,换个版本试试
            ProjectFile projectFile = mppReader.read(inputStream);
            // 从文件中获取的任务对象
            List<Task> tasks = projectFile.getChildTasks();
            // 解析后数据存入对象
            List<ProjectProgressEntity> 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<Task> taskList, ProjectProgressEntity currentProjectProgress, List<ProjectProgressEntity> 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文件
        <!-- 引入依赖:解析project的.mpp文件 -->
        <dependency>
            <groupId>net.sf.mpxj</groupId>
            <artifactId>mpxj</artifactId>
            <version>10.14.1</version>
        </dependency>

相关推荐

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

    2024-06-12 07:14:04       33 阅读
  2. json文件读取

    2024-06-12 07:14:04       26 阅读
  3. Spring 使用@Value注解读取配置文件数组

    2024-06-12 07:14:04       59 阅读
  4. 使用python读取多类型文件夹文档内容】

    2024-06-12 07:14:04       39 阅读
  5. 使用 R 读取Excel文件特定列

    2024-06-12 07:14:04       36 阅读
  6. 使用 Python 读取 Word 文件

    2024-06-12 07:14:04       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-06-12 07:14:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-06-12 07:14:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-06-12 07:14:04       82 阅读
  4. Python语言-面向对象

    2024-06-12 07:14:04       91 阅读

热门阅读

  1. 代码随想录算法训练营第二十五天

    2024-06-12 07:14:04       39 阅读
  2. unity text根据文本内容自动设置高度

    2024-06-12 07:14:04       35 阅读
  3. 【镜像制作】node.js+pm2的latest版镜像制作

    2024-06-12 07:14:04       32 阅读
  4. 快人一步!利用LLM实现数据处理自动化

    2024-06-12 07:14:04       32 阅读
  5. 特别名词Text Paper4

    2024-06-12 07:14:04       27 阅读
  6. ioctlsocket

    2024-06-12 07:14:04       30 阅读