写这个的思路是:将.mpp文件中的内容读取出来,我只需要他的一级和二级目录,一级目录、二级目录各一张表,二级目录表存一级目录的主键id,这点和网上其他的方法不太一样,大多数都是一张表就完事的,因为表不是我设计的,所以只能这么去做,下面开始码代码:
首先是pom.xml文件,这里用到了mpxj 包
这里要注意的是,比4.5.0低的版本,如果你读取的是2010以上版本的.mpp文件会报错
<!-- https://mvnrepository.com/artifact/net.sourceforge/mpxj -->
<dependency>
<groupId>net.sourceforge</groupId>
<artifactId>mpxj</artifactId>
<version>4.5.0-rc1</version>
</dependency>
然后是后台代码
public FileUploadModel9 getFileUploadModel() {//这个方法框架的方法,主要看下面这么获取文件
if (fileUploadModel == null) {
AttachHandler9 handler = new AttachHandler9(){
private static final long serialVersionUID = 1L;
@Override
public boolean beforeSaveAttachToDB(Object attach) {
FrameAttachStorage attach2 = (FrameAttachStorage)attach;
byte[] content = FileManagerUtil.getContentFromInputStream(attach2.getContent());
//字节转InputStream
InputStream sbs = new ByteArrayInputStream(content);
MPPReader reader = new MPPReader();
ProjectFile projectFile;
try {
projectFile = reader.read(sbs);
//读本地的.mpp文件,用于测试
//projectFile = reader.read("C:/Users/pls/Desktop/test.mpp");
List<Task> list = projectFile.getAllTasks();
Task t = (Task) list.get(0);
for(int i=1 ; i<list.size();i++){
Task task = list.get(i);
if(task.getParentTask() != null){
if(task.getParentTask().getUniqueID() == t.getUniqueID()){
String rowguid = UUID.randomUUID().toString();
Projectclass pc = new Projectclass();
pc.setRowguid(rowguid);
pc.setGcjssj(task.getFinish());
pc.setGcmc(task.getName());
pc.setGckssj(task.getStart());
pc.setProjectguid(projectguid);//TODO 选择项目id
service.insert(pc);//保存一级目录
for (int j = 0; j < task.getChildTasks().size(); j++) {
List<Task> tasklist = task.getChildTasks();
Task task2 = tasklist.get(j);
if(task2.getParentTask().getUniqueID() == task.getUniqueID()){
Projectschedule psc = new Projectschedule();
psc.setRowguid(UUID.randomUUID().toString());
psc.setOperatedate(new Date());
psc.setJhkssj(task2.getStart());
psc.setJhjssj(task2.getFinish());
psc.setProjectClassguid(rowguid);
psc.setJdmc(task2.getName());
psc.setMilestone("0");
service.insert(psc);//保存二级目录
}
}
}
}
}
}
catch (MPXJException e) {
e.printStackTrace();
}
return true;
}
@Override
public void afterSaveAttachToDB(Object arg0) {
}
};
fileUploadModel = new FileUploadModel9(new DefaultFileUploadHandlerImpl9(null, null, null,
handler, userSession.getUserGuid(), userSession.getDisplayName()));
}
return fileUploadModel;
}
这样,就完成了读取,入库的操作,只要在页面上刷新下,就可以读出数据了