本文主要记录一次开发过程中遇到的业务需求,解析并导入project(.mpp扩展名)文件的过程。
以及根据WBS码和父子级关系维护父子级关系的过程。
因对project文件不了解,目的为记录开发过程,若有不当之处,欢迎各位大佬指正。

首先需要引入下面的jar包,根据自己实际需要引用,以下是maven的引用方式。

         <!-- 导入 project 需要引入的包--><dependency><groupId>net.sf.mpxj</groupId><artifactId>mpxj</artifactId><version>8.3.3</version></dependency>

以下是相关的代码:

model类

public class ElecPlanTaskModel  {private String planTaskId;private Integer levelNum;private String wbsCode;private String taskName;private String gridName;private String floor;private Date planStartTime;private Date planFinishTime;private String planDueTime;private String taskType;private String profession;private String siteName;private String elecState;//WBS码private String wbs;/*** 行父级idd*/private int rowParentId;/*** 行id*/private int rowId;//此处省略get set 方法

1.判断导入的文件类型,调用相应的方法解析文件

 public ResultEntity importElecPlanTask(HttpServletRequest request) throws Exception {ResultEntity resultEntity = new ResultEntity<>();DiskFileItemFactory factory = new DiskFileItemFactory();ServletFileUpload upload = new ServletFileUpload(factory);List<FileItem> items = null;try {items = upload.parseRequest(request);} catch (FileUploadException e) {e.printStackTrace();}if (items.size() > 0) {for (FileItem fileItem : items) {String name = fileItem.getName();if (Strings.isEmpty(name)) {continue;}List<ElecPlanTaskModel> listModel = new ArrayList<>();ResultEntity<List<ElecPlanTaskModel>> result = new ResultEntity<>();String fileType = name.substring(name.lastIndexOf(".") + 1);//如果文件类型是project,使用如果文件类型是project的方式处理if ("mpp".equals(fileType)) {result = importProjectFile(fileItem);} else {resultEntity.setSuccess(false);resultEntity.setMessage("文件类型错误,仅支持Excel和project文件导入!");return resultEntity;}if (result.isSuccess()) {//拿到构造好的数据列表listModel = result.getBusinessObject();} else {resultEntity.setMessage(result.getMessage());resultEntity.setSuccess(result.isSuccess());return resultEntity;}}} else {resultEntity.setSuccess(false);resultEntity.setMessage("没有要导入的数据");}return resultEntity;}

2.导入project -.mpp文件的解析和层级构造

//Mpp的公共常量
public class MppConsts {public static final String GRID_NAME = "轴网区间";public static final String WBS_CODE = "WBS编码";public static final String FLOOR = "层";public static final String TASK_TYPE = "任务类型";public static final String PROFESSION = "任务类型";public static final String SITE_NAME = "项目名称";public static final String CONST_COMPLETE_STATE = "施工阶段";}/*** MPP文件的解析过程(此处是根据父子级任务id构造层级关系的)* @param fileItem* @return* @throws Exception*/
private ResultEntity<List<ElecPlanTaskModel>> importProjectFile(FileItem fileItem) throws Exception {ResultEntity resultEntity = new ResultEntity<>();//构造一个临时路径存上传的文件String exportFilePath = FileNameUtils.buildExportPath(fileItem.getName(), this.getClass());File file = new File(exportFilePath);FileUtils.forceMkdir(file.getParentFile());//将上传的文件写到临时路径里面fileItem.write(file);//组装目录的基础数据List<ElecPlanTaskModel> listModel = new ArrayList<>();MPPReader mppRead = new MPPReader();//注意,如果在这一步出现了读取异常,肯定是版本不兼容,换个版本试试ProjectFile pf = mppRead.read(file);//从文件中获取的任务对象List<Task> tasks = pf.getAllTasks();for (int i = 1; i < tasks.size(); i++) {Task task = tasks.get(i);ElecPlanTaskModel taskModel = new ElecPlanTaskModel();taskModel.setLevelNum(task.getOutlineLevel());taskModel.setWbs(task.getWBS());taskModel.setPlanStartTime(task.getStart());taskModel.setPlanFinishTime(task.getFinish());taskModel.setTaskName(task.getName());//工期,拿到的是double类型,我存的类型是String需要转换为StringtaskModel.setPlanDueTime(Long.toString(Math.round(task.getDuration().getDuration())));taskModel.setWbsCode(String.valueOf(task.getFieldByAlias(MppConsts.WBS_CODE) == null ? "" : task.getFieldByAlias(MppConsts.WBS_CODE)));taskModel.setGridName(String.valueOf(task.getFieldByAlias(MppConsts.GRID_NAME) == null ? "" : task.getFieldByAlias(MppConsts.GRID_NAME)));taskModel.setFloor(String.valueOf(task.getFieldByAlias(MppConsts.FLOOR) == null ? "" : task.getFieldByAlias(MppConsts.FLOOR)));taskModel.setTaskType(String.valueOf(task.getFieldByAlias(MppConsts.TASK_TYPE) == null ? "" : task.getFieldByAlias(MppConsts.TASK_TYPE)));taskModel.setProfession(String.valueOf(task.getFieldByAlias(MppConsts.PROFESSION) == null ? "" : task.getFieldByAlias(MppConsts.PROFESSION)));taskModel.setSiteName(String.valueOf(task.getFieldByAlias(MppConsts.SITE_NAME) == null ? "" : task.getFieldByAlias(MppConsts.SITE_NAME)));//行idtaskModel.setRowId(task.getID());//行的父级idif (task.getParentTask() != null) {taskModel.setRowParentId(task.getParentTask().getID());}listModel.add(taskModel);}//两种构造层级的关系,选择其中一个就好//根据子父级关系组装层级关系for (ElecPlanTaskModel planTaskModel : listModel) {for (ElecPlanTaskModel parentModel : listModel) {if ( planTaskModel.getRowParentId() == parentModel.getRowId()) {planTaskModel.setParentId(parentModel.getPlanTaskId());}}}//根据WBS码构造层级关系// packagePlanTask(listModel);//删除暂存地址的文件,这个可以自己写一个方法,此处就不介绍了FileNameUtils.delete(exportFilePath, false);//返回整个构造好的列表数据resultEntity.setBusinessObject(listModel);resultEntity.setSuccess(true);return resultEntity;}

3.层级构造

    /*** 根据WBS编码构造层级关系* @param listModel*/private void packagePlanTask(List<ElecPlanTaskModel> listModel) {List<ElecPlanTaskModel> parentList = new ArrayList<>();//组装数据,根据WBS 的值确定导入的层级,并分布父子级关系,排序根据层级来设置for (ElecPlanTaskModel planTaskModel : listModel) {String wbs = planTaskModel.getWbs();if (Strings.isEmpty(wbs)) {continue;}String[] wbsList = null;if (Strings.isNotBlank(wbs)) {wbsList = wbs.split("\.");//levleNum层级:根据“.”分割WBS,分割结果的长度即为目录层级planTaskModel.setLevelNum(wbsList.length);}if (wbsList.length == 1) {//如何确定/匹配父级节点(WBS根据"." 分割,长度为1,即为父级节点)parentList.add(planTaskModel);} else {String lastNum = wbsList[wbsList.length - 1];Integer lastLength = lastNum.length();//1.parentId,否则截取掉wbs最后的".XX",剩余部分在列表中匹配,匹配到的对象即为父级String subWbs = wbs.substring(0, wbs.length() - (lastLength + 1));for (ElecPlanTaskModel model : listModel) {if (subWbs.equalsIgnoreCase(model.getWbs())) {planTaskModel.setParentId(model.getPlanTaskId());break;}}}}}

到这里,文件导入应该是成功了,但是project文件的导入层级是否正确依赖于project文件编制过程中层级维护的正确性。
如:根据WBS码构造层级,WBS码必须编制有规律,符合层级结构等。
如果project文件存在层级问题,根据父子级关系构造层级结构也会有问题。

Java文件导入 project .mpp文件解析导入 并通过父子级关系或WBS码构造层级关系相关推荐

  1. java解析Microsoft Project mpp文件(

    背景: 在公司项目中,技术总监之前让我开发了一个甘特图的功能,当然这引用了一个开源的js框架. 我负责的是查找表单,将表单的数据通过递归的方式获取后,然后动态创建一个树形的符合那个js框架的xml文件 ...

  2. java 读取 解析微软Project .mpp 文件到甘特图

    1.引入价包; <dependency><groupId>org.apache.poi</groupId><artifactId>poi</art ...

  3. 新点软件怎么导入清单_excle表怎么导入新点,怎样把EXCEL表格导入project 中?

    excel怎么将表格导入另一个表格 直接复制-粘贴其实更加. 导入有格式等的要求,软件版本也是有的. 如果你想不改变格式将一个表格的数据全部复制过来,有两种方法: 一.不打开要复制的表格,直接将这个表 ...

  4. 在C#中以编程方式将 MS Project MPP 转换为 Word 文档

    Microsoft Project ( MPP ) 文件用于不同的项目管理任务,例如组织和跟踪项目以及管理资源.如果希望文档形式的项目数据进一步修改和共享,可以通过将 MPP 文件转换为 Word D ...

  5. java 读取project_java 导入读取.mpp project文件(甘特图)

    写这个的思路是:将.mpp文件中的内容读取出来,我只需要他的一级和二级目录,一级目录.二级目录各一张表,二级目录表存一级目录的主键id,这点和网上其他的方法不太一样,大多数都是一张表就完事的,因为表不 ...

  6. JAVA实现微软project文件导入

    JAVA实现微软project文件导入 前言 一.pom.xml引用jar包 二.实现代码 1.实体类(对应自己的数据库表字段) 2.业务服务类(读取project文件并存表) 2.1 上传方法(ad ...

  7. java导入错误怎么解决_eclipse导入文件及导入错误的解决方法

    在 Eclipse 中导入 Java 程序,分导入Java Project和导入Java源程序 两种情况,简述如下. 情况一:导入 Java Project Step1 . File -> Im ...

  8. XX健康:预约管理-预约设置日历插件文件简单下载Excel文件解析Excel表数据批量导入

    1. 需求分析 前面我们已经完成了检查项管理.检查组管理.套餐管理等.接下来我们需要进行预约设置,其实就是设置每一天的体检预约最大数量.客户可以通过微信端在线预约,在线预约时需要选择体检的时间,如果客 ...

  9. 【JavaWeb开发】使用java实现简单的Excel文件的导入与导出(POI)

    前言:在实际的开发中,我们经常需要用户在界面中输入大量重复且有规律的数据,但是一个表单一个表单的填写效率过慢,而且过多的表单也会给JavaWeb的业务逻辑开发带来不小的困扰,所以我们可以使用一个Exc ...

  10. CentOS部署JAVA程序、安装Tomcat以及安装导入mysql文件的方法

    注意:由于流程太过于繁杂,且坑多,这里只保留关键步骤,具体小问题百度! ________________________ 先进入CentOS6.8图形化界面(如阿里云没有默认的图形化界面,自己去安装h ...

最新文章

  1. javascript组件_是的,JavaScript运行Swift。 无论如何都要构建您的组件库。
  2. 07、poly-A内参和杂交内参(arrayanalysis的问题)
  3. VTK:直线网格之RGrid
  4. 计算机网络实验arp协议分析,计算机网络ARP地址协议解析实验报告
  5. Java 9模块服务
  6. Python中的openpyxl如何对excel修改文件
  7. Windows学习总结(13)——各品牌电脑进入BIOS按键汇总
  8. ODrive踩坑(二)3508电机和TLE5012B磁编码器参数配置、校准、位置闭环模式转动电机(TLE5012B-E1000)
  9. Rancher Managed Network实践
  10. 谷歌开源“穷人版”摘要生成NLP模型:训练成本低,只要1000个样本就能打败人类...
  11. Matlab中grid 的使用
  12. DCDC开关电源的阶跃响应和动态响应(Load Transient)的区别
  13. cannot import name ‘_validate_lengths‘ from ‘numpy.lib.arraypad‘错误
  14. QTableView中添加icon
  15. Presto 在美图的实践
  16. node和npm的关系,node和npm的关联
  17. 疫情下的企业应对之道:企业如何降本提质增效
  18. react + zarm + antV F2 实现账单数据统计饼图效果
  19. 工作总结PPT怎么写?60套工作总结PPT模板:年度汇报、项目汇报,晋升述职
  20. 乳腺癌2002~2018城市和乡村个年龄段患病率曲线图绘制 ---pyechart

热门文章

  1. Classifier Guided Diffusion
  2. 用python绘制派大星_1行代码搞定Latex公式编写,这个4.6M的Python小插件,写论文必备...
  3. win10设置计算机关机时间,win10怎样固定时间关机_win10怎样设置电脑关机时间设置...
  4. 最简单、最详细的装系统教程,你get到了吗?
  5. 龙果支付 mysql_开源版龙果支付系统-国内首款开源的互联网支付系统
  6. 国内百兆独立服务器哪里的比较便宜镇江电信好吗
  7. 利用pyecharts+sklearn实现链家北京二手房房价预测
  8. 阿里前浪产品人*N,也谈产品和PM
  9. Altium Designer19 多层板设计教程
  10. 原谅我,无法刻骨铭心地记住你