使用pyjnius和mpxj来读取mpp文件

因为想要处理ms project文件的读写,所以找了关于,找到 mpxj 这个开源项目,不过它只能读,不能写。所以还是有遗憾啊。

下面我的想法就是用pyjnius来调用mpxj来读取一个mpp文件。

环境安装

从mpxj网站上下载它的源码包。在它的包里,已经有一个mpxj.jar的文件了。将它拷贝到你的机器上,然后设置CLASSPATH。因为我们要调用mpp,所以它还要求你要安装POI的包(POI是apache的一个项目,看介绍是用来读微软格式的一个库),而mpxj的lib目录下已经带了一个,所以你不用再到POI的网站上下载了。直接把这个包也拷贝到机器上,然后同样添加到CLASSPATH上。如:

export CLASSPATH=$CLASSPATH:poi-3.7.jar:mpxj.jar

代码示例

下面是pyjnius写的读取test.mpp,并且打印:任务名,ID, 开始时间,结束时间

from jnius import autoclass
MPPReader = autoclass('net.sf.mpxj.mpp.MPPReader')
ProjectFile = autoclass('net.sf.mpxj.ProjectFile')
Format = autoclass('java.text.SimpleDateFormat')

f = Format('yyyy-MM-dd')

reader = MPPReader()
project = reader.read('test.mpp')
tasks = project.getAllTasks()
for i in range(tasks.size()):
    task = tasks.get(i)
    print unicode(task.getName() or '', 'utf8').encode('gbk'), task.getID(), f.format(task.getStart()), f.format(task.getFinish())

代码不是很长,有几点说明:

  1. 通过autoclass可以得到对应的java类
  2. 日期对象要转換才能看到正确的形式,当然也可以考虑用toString(),不过不是yyyy-mm-dd的形式
  3. getAllTasks()会返回一个java的List类。pyjnius并不会自动转为python的list,所以你要使用java的api来处理List对象
  4. 在print时我把任务的名字转为了gbk编码,我发现mpp中的中文是utf8编码的。转为gbk是为了方便在控制台上看结果。
  5. 使用getAllTasks()得到的是按顺序读取的任务项,所以为了处理为树,你可以根据task.getParentTask()得到父任务对象。然后再通过getID()来得到ID值。然后再处理为树。
  6. 可以使用dir(task)查看一个任务对象的方法,非常多。

只要环境配好了,代码还是挺简单的。剩下的就是处理树和理解mpp中的属性哪些用得上了。

pyjnius在2.6下的bug

因为我测试环境是python 2.6,所以在print task时发现报了一个:

ValueError: zero length field name in format

的问题。后来发现是使用string.format时,在2.6下 {} 必须要写索引号,而在2.7下就不用。所以我向pyjnius提交了一个 pull request 。如果你也使用2.6环境,可以考虑自行修改。

你可能感兴趣的:(使用pyjnius和mpxj来读取mpp文件)