`
betafox
  • 浏览: 150379 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

实现Microsoft Project 的解析和内容抽取

阅读更多

 

  • 文本内容提取:  使用net.sf.mpxj 的工具提取文本内容;
package com.koders.se.parser;

import com.koders.se.search.WikiDOC;
import net.sf.mpxj.ProjectFile;
import net.sf.mpxj.Resource;
import net.sf.mpxj.ResourceAssignment;
import net.sf.mpxj.Task;
import net.sf.mpxj.mpp.MPPReader;
import net.sf.mpxj.mpx.MPXReader;
import net.sf.mpxj.mspdi.MSPDIReader;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * Microsoft project 解析器
 */
public class MppDocHandler implements DocumentHandler {

    public Document getDocument(InputStream is)
            throws DocumentHandlerException {

        ProjectFile mpx = readProject(is);

        String bodyText = dumpText(mpx);

        if (bodyText != null) {
            Document doc = new Document();

            doc.add(new Field(WikiDOC.DOC_TITLE, dumpTitle(mpx), Field.Store.YES, Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS));

            doc.add(new Field(WikiDOC.DOC_CONTENT, bodyText, Field.Store.COMPRESS, Field.Index.TOKENIZED, Field.TermVector.WITH_POSITIONS_OFFSETS));

            
            return doc;
        }
        return null;
    }

    public static ProjectFile readProject(InputStream is) throws DocumentHandlerException {
        is = new BufferedInputStream(is);
        is.mark(0);//下面需要重复使用输入流,所以重新包装并设置重置标记

        ProjectFile mpx = null;

        try {
            mpx = new MPXReader().read(is);
        }
        catch (Exception ex) {
            try {
                is.reset();//重置
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if (mpx == null) {
            try {
                mpx = new MPPReader().read(is);
            }
            catch (Exception ex) {
                try {
                    is.reset();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

        if (mpx == null) {
            try {
                mpx = new MSPDIReader().read(is);
            }
            catch (Exception ex) {
            }
        }

        if (mpx == null) {
            throw new DocumentHandlerException("Failed to read file");
        }
        return mpx;
    }

    private final static SimpleDateFormat f = new SimpleDateFormat("yyyy年M月d日");

    private final static String IndentString = "   ";

    private List idList = new ArrayList();
    private List nameList = new ArrayList();
    private List resList = new ArrayList();
    private List startList = new ArrayList();
    private List endList = new ArrayList();

    public String dumpTitle(ProjectFile file) {
        String title = "";
        List childTasks = file.getChildTasks();
        for (int i = 0; i < childTasks.size(); i++) {
            Task task = (Task) childTasks.get(i);
            title += task.getName() + " ";
        }
        return title;
    }

    public String dumpText(ProjectFile file) {
        idList.add("【编号】");
        nameList.add("【任务名】");
        resList.add("【资源】");
        startList.add("【开始时间】");
        endList.add("【结束时间】");

        List childTasks = file.getChildTasks();
        for (int i = 0; i < childTasks.size(); i++) {
            Task task = (Task) childTasks.get(i);
            idList.add("  " + task.getID().toString());
            nameList.add(task.getName());
            resList.add(listTaskRes(task));
            startList.add(f.format(task.getStart()));
            endList.add(f.format(task.getFinish()));
            listHierarchy(task, IndentString);
        }

        idList = fixLength(idList);
        nameList = fixLength(nameList);
        resList = fixLength(resList);
        startList = fixLength(startList);
        endList = fixLength(endList);

        StringBuffer buf = new StringBuffer();
        for (int i = 0, size = nameList.size(); i < size; i++) {
            buf.append(idList.get(i))
                    .append(nameList.get(i))
                    .append(IndentString)
                    .append(resList.get(i))
                    .append(IndentString)
                    .append(startList.get(i))
                    .append(IndentString)
                    .append(endList.get(i))
                    .append("\n");
        }

        idList.clear();
        nameList.clear();
        startList.clear();
        endList.clear();
        resList.clear();

        return buf.toString();

    }

    private List fixLength(List data) {
        int max = 0;
        for (int ii = 0; ii < data.size(); ii++) {
            String str = (String) data.get(ii);
            int tmp = str.getBytes().length;
            max = (max < tmp ? tmp : max);
        }
        List ret = new ArrayList();
        for (int ii = 0; ii < data.size(); ii++) {
            String str = (String) data.get(ii);
            int tmp = max - str.getBytes().length;
            for (int i = 0; i < tmp; i++) {
                str = str.concat(" ");
            }
            ret.add(str);
        }
        return ret;
    }

    private void listHierarchy(Task task, String indent) {
        List childTasks = task.getChildTasks();
        for (int i = 0; i < childTasks.size(); i++) {
            Task child = (Task) childTasks.get(i);
            idList.add("  " + child.getID().toString());
            nameList.add(indent + child.getName());
            resList.add(listTaskRes(child));
            startList.add(f.format(child.getStart()));
            endList.add(f.format(child.getFinish()));
            listHierarchy(child, indent + IndentString);
        }
    }

    private String listTaskRes(Task task) {
        StringBuffer buf = new StringBuffer();
        List assignments = task.getResourceAssignments();
        for (int i = 0; i < assignments.size(); i++) {
            ResourceAssignment assignment = (ResourceAssignment) assignments.get(i);
            Resource resource = assignment.getResource();

            if (resource != null) {
                buf.append(resource.getName()).append(" ");
            }
        }
        return buf.toString();
    }

    public static void main(String[] args) throws Exception {
        MppDocHandler mppDocHandler = new MppDocHandler();
        ProjectFile projectFile = MppDocHandler.readProject(new FileInputStream("项目实施计划.mpp"));
        String s = mppDocHandler.dumpText(projectFile);
        System.out.println(s);
    }

}
  •  输出格式:

 


【编号】【任务名】                                          【资源】                                【开始时间】    【结束时间】
  0     **扩建项目实施计划_0903                                                                     2008年4月1日    2008年7月1日
  1        项目启动                                                                                2008年4月1日    2008年4月8日
  2           组建项目组、制订项目计划                                                               2008年4月1日    2008年4月8日
  3           项目启动会                                                                            2008年4月1日    2008年4月1日
  60          综合业务管理子系统需求分析                     张四季 黄纬 笋素爱 李海涛 李贤宇         2008年4月1日    2008年5月4日
  61             业务管理                                   张四季 黄纬 笋素爱 李海涛                2008年4月1日    2008年4月15日
  62                提交调研提纲文档                        张四季 黄纬 笋素爱                       2008年4月1日    2008年4月1日
  63                需求内容调研                            张四季 黄纬 笋素爱                        2008年4月2日    2008年4月3日
  64                   业务种类设置                         张四季 黄纬 笋素爱                        2008年4月2日    2008年4月3日
  65                   增值业务支撑                         张四季 黄纬 笋素爱                        2008年4月2日    2008年4月3日
  66                   监控策略设置                         张四季 黄纬 笋素爱                        2008年4月2日    2008年4月3日
  67                   封堵策略设置                         张四季 黄纬 笋素爱                        2008年4月2日    2008年4月3日
  68                   广告策略设置                         张四季 黄纬 笋素爱                        2008年4月2日    2008年4月3日
  69                需求分析                                张四季 黄纬 笋素爱                       2008年4月7日    2008年4月7日
  70                   整理调研文档                                                                  2008年4月7日    2008年4月7日
  71                   编写需求说明书-业务管理部分                                                   2008年4月7日    2008年4月7日
  72                页面原型设计                            张四季 黄纬 笋素爱                        2008年4月8日    2008年4月14日
  73                业务管理需求与页面原型确认              张四季 黄纬 笋素爱                        2008年4月15日   2008年4月15日
  74             资料管理                                   笋素爱                                    2008年4月16日   2008年4月23日
  75                提交调研提纲文档                                                                 2008年4月16日   2008年4月16日
  76                需求内容调研                                                                     2008年4月17日   2008年4月17日
  77                   客户资料管理                                                                  2008年4月17日   2008年4月17日
  78                   黑名单管理                                                                    2008年4月17日   2008年4月17日
  79                   白名单管理                                                                    2008年4月17日   2008年4月17日
  80                   ADSL帐号管理                                                                  2008年4月17日   2008年4月17日
  81                   IP地址管理                                                                    2008年4月17日   2008年4月17日
  82                需求分析                                                                         2008年4月18日   2008年4月18日
  83                   整理调研文档                                                                  2008年4月18日   2008年4月18日
  84                   编写需求说明书-资料管理部分                                                   2008年4月18日   2008年4月18日
  85                页面原型设计                                                                     2008年4月21日   2008年4月22日
  86                资料管理需求与页面原型确认                                                       2008年4月23日   2008年4月23日
  87             数据管理                                   张四季 黄纬                              2008年4月16日   2008年4月23日
  88                提交调研提纲文档                                                                 2008年4月16日   2008年4月16日
  89                需求内容调研                                                                     2008年4月17日   2008年4月17日
  90                   数据采集                                                                      2008年4月17日   2008年4月17日
  91                   数据转换                                                                      2008年4月17日   2008年4月17日
  92                   数据导出                                                                      2008年4月17日   2008年4月17日
  93                需求分析                                                                         2008年4月18日   2008年4月18日
  94                   整理调研文档                                                                  2008年4月18日   2008年4月18日
  95                   编写需求说明书数据管理部分                                                    2008年4月18日   2008年4月18日
  96                页面原型设计                                                                     2008年4月21日   2008年4月22日
  97                数据管理需求与页面原型确认                                                       2008年4月23日   2008年4月23日
  98             综合查询                                   笋素爱                                    2008年4月24日   2008年5月4日
  99                提交调研提纲文档                                                                 2008年4月24日   2008年4月24日
  100               需求内容调研                                                                     2008年4月25日   2008年4月25日
  101                  客户基本信息查询                                                              2008年4月25日   2008年4月25日
  102                  ADSL帐号查询                                                                  2008年4月25日   2008年4月25日
  103                  专线IP查询                                                                    2008年4月25日   2008年4月25日
  104                  业务策略查询                                                                  2008年4月25日   2008年4月25日
  105                  流量数据查询                                                                  2008年4月25日   2008年4月25日
  106               需求分析                                                                         2008年4月28日   2008年4月28日
  107                  整理调研文档                                                                  2008年4月28日   2008年4月28日
  108                  编写需求说明书-综合查询部分                                                   2008年4月28日   2008年4月28日
  109               页面原型设计                                                                     2008年4月29日   2008年4月30日
  110               综合查询需求与页面原型确认                                                       2008年5月4日    2008年5月4日
  208         提交第一版需求说明书                           全体需求人员                             2008年5月5日    2008年5月5日

 

分享到:
评论
3 楼 chkang 2008-06-23  
我需要把数据库中的数据导出生成mpp文件,用mpxj,请问怎么实现啊
邮箱chenhui_19850710@sina.com.cn
2 楼 kelefa 2008-06-04  
<div class='quote_title'>这样就可以了: </div>
<div class='quote_title'>MPXWriter writer = new MPXWriter(); </div>
<div class='quote_title'>writer.setLocale(Locale.CHINESE);</div>
1 楼 kelefa 2008-06-04  
我需要用mpxj生成mpx文件, 但是中文是???之类 的乱码, 你知道如何解决吗?
我加上这个也不行:
file.getFileCreationRecord().setCodePage(CodePage.ZH);

相关推荐

    C#在线考试系统VS2008+SQL2005

    【C#在线考试系统VS2008+SQL2005】是一个基于Web的考试管理系统,使用了Microsoft的Visual Studio 2008(VS2008)开发环境和C#编程语言,结合ASP.NET 3.5框架进行构建。系统后端数据库采用的是SQL Server 2005,提供...

    项目时间管理作业.pdf

    根据提供的文件内容,虽然信息显得混乱且存在OCR技术导致的识别错误,但我们可以尝试从中抽取和解读一些关键的知识点,尤其是关于项目时间管理的作业。以下为详细知识点的解析: 1. **项目时间管理概述**:项目时间...

    水利水电工程初设计报告编程.doc

    使用项目管理软件如Microsoft Project可以有效地管理整个工程项目的进度、成本和资源分配等问题,确保项目按计划顺利进行。 综上所述,《水利水电工程初设计报告编程》不仅涉及到了水利工程领域的专业知识,还涵盖...

    Oracle Data Integrator學習筆記

    除了以上主要内容外,文档还附录了一些其他相关信息,比如如何将 ODI 与 Microsoft SQL Server 2005 集成,以及当前版本存在的问题列表等。 总结而言,Derek.Jaa 的这份 ODI 学习笔记全面地覆盖了从概念理解到实际...

    多维数据集项目

    为了实现高效的多维数据集,还需要考虑数据的分区和聚合策略,以减少查询时的计算量和提高响应速度。同时,安全性设置必须妥善管理,防止未授权访问敏感数据。 总结起来,"多维数据集项目"可能涵盖了数据仓库设计、...

Global site tag (gtag.js) - Google Analytics