Java利用mpxj解析mpp格式文件

本文介绍了如何使用Java结合MPXJ库解析Microsoft Project的MPP文件,详细讲解了MPP文件的结构,展示了使用MPXJ进行文件解析的代码示例,以及如何处理自定义字段的读取。同时,文章提到了数据存储和在实际应用中遇到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转载请注明来源:http://blog.youkuaiyun.com/loongshawn/article/details/51038051

1、mpp文件介绍

MPP是Microsoft Project项目管理软件的文件扩展名,此软件旨在帮助个人跟踪,组织或维护项目。

2、mpp显示效果

这里写图片描述

可以通过在线的mpp阅读工具打开的,该工具免费,但限制了上传文件大小不超过2M。
https://www.projectplan365.com/projectviewernow/tViews.aspx#

3、mpp结构说明

通过上图可以看出,文件主体内容就是一条一条的记录,记录内容包括:任务ID、任务名、Duration、Start日期、Finish日期、Predecessors业务流、自定义字段。

接下来,我们先来了解下mpp文档的解析工具类,目前主要是通过MPXJ工具类来解析该文件。

MPXJ官方网站:http://www.mpxj.org/index.html

MPXJ官方API说明文档:http://www.mpxj.org/apidocs/index.html

实例中引入的maven依赖版本:

<dependency>
	<groupId>net.sf.mpxj</groupId>
	<artifactId>mpxj</artifactId>
	<version>5.2.2</version>
</dependency>

Package net.sf.mpxj.mpp
上面这个包是处理MPP文件解析的主要集合,通过net.sf.mpxj.mpp.MPPReader类来构建读文件管道。

每条具体的任务都需要通过这个类net.sf.mpxj.Task来解析。

// 普通任务ID
Integer task_id =task.getID();
// 独立任务ID
Integer task_unique_id =task.getUniqueID();
// 大纲ID
Integer task_outline_level =task.getOutlineLevel();
// 任务周期
double task_duration =task.getDuration().getDuration();
// 任务名
String task_name = task.getName();
// 任务开始日期
Date task_start_date = task.getStart();
// 任务结束日期
Date task_finish_date = task.getFinish();
// 任务流
List<Relation> task_predecessors = task.getPredecessors();		   

4、mpp解析代码

解析线上mpp文件,同时获取TaskInfo

// NO.1 解析mpp文件,同时获取TaskInfo
	public static List<TaskInfo> readInputStream(InputStream in,String fileName){
   
		
		List<TaskInfo> taskList = new ArrayList<TaskInfo>();
		InputStream ins = in;
		
		try{
   		    
		    MPPReader mppRead = new MPPReader();
		    ProjectFile pf = mppRead.read(in);
		    logger.info("MPXJUtils.method [readInputStream]: fileName-" + fileName);

		    List<Task> tasks = pf.getAllTasks();
		    logger.info("MPXJUtils.method [readInputStream]: taskSize-" + tasks.size());
		    
		    for (int i = 0; i < tasks.size(); i++) {
   
		    	Task task = tasks.get(i);
		    	
		    	Integer task_id = task.getID();
		    	Integer task_unique_id = task.getUniqueID();
		    	Integer task_outline_level = task.getOutlineLevel();
		    	double task_duration = task.getDuration().getDuration();
		    	String task_name = task.getName();
		    	Date task_start_date = task.getStart();
		    	Date task_finish_date = task.getFinish();
		    	List<Relation> task_predecessors = task.getPredecessors();		    			    	
		    	logger.info("MPXJUtils.method [readInputStream] taskInfo:" + task_id + "|" + task_unique_id + "|" + task_outline_level + "|" + task_duratio
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值