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>