1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 使用pyjnius和mpxj来读取mpp文件

使用pyjnius和mpxj来读取mpp文件

时间:2019-01-01 19:36:49

相关推荐

使用pyjnius和mpxj来读取mpp文件

独角兽企业重金招聘Python工程师标准>>>

因为想要处理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 autoclassMPPReader = 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())

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

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。