`
betafox
  • 浏览: 146925 次
  • 性别: 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);

相关推荐

    通过java导入读取微软项目管理文件(配套代码和导入project文件)

    在IT行业中,尤其是在项目管理领域,能够有效地处理和解析微软的Project文件是非常重要的技能。Java作为一种广泛应用的编程语言,提供了多种方法来实现这一目标。本篇文章将深入探讨如何使用Java来导入并读取微软的...

    microsoft project完美详细教程

    Microsoft Project是一款强大的项目管理软件,由微软公司开发,...通过本教程的学习,你将掌握Microsoft Project的各项核心功能,无论是初学者还是经验丰富的项目经理,都能从中受益,实现项目管理的专业化和精细化。

    microsoft Project 试题 50题(含答案)

    这些试题旨在帮助用户了解 Microsoft Project 的功能和应用,掌握项目管理的基本概念和技术。 知识点 1:任务相关性 在 Microsoft Project 中,任务相关性是指两个或多个任务之间的逻辑关系。任务相关性可以分为四...

    从MS Project 导入内容 (C#)

    MS Project 文件导入与操作相关知识点 ...了解 MS Project 文件格式、使用 C# 控制 MS Project、导入 MS Project 文件、任务信息抽取、任务信息处理、错误处理和 MS Project 文件导出等知识点对于开发者来说非常重要。

    Microsoft Project 2002教学

    Microsoft Project 2002 是一款由微软公司开发的项目管理软件,它提供了强大的计划、组织、跟踪和控制项目资源的能力。这款软件广泛应用于各种规模的企业和组织,帮助项目经理有效地管理任务、时间、成本以及人力...

    MicrosoftProject基础教程PPT课件.pptx

    "MicrosoftProject基础教程PPT课件.pptx" 本资源是Microsoft Project基础教程PPT课件,...该资源对Microsoft Project的基础知识和操作进行了详细的介绍和解释,旨在帮助用户快速掌握Microsoft Project的使用和应用。

    mpxj解析ms project+生成xml文件

    在IT行业中,项目管理软件是不可或缺的工具,Microsoft Project(MS Project)就是其中的一款著名软件,广泛用于规划、跟踪和管理各种项目。然而,不同系统和应用之间有时需要数据交换,这时就需要对MS Project文件...

    Microsoft Project 2002教学手册

    为了提高团队协作效率,Project 2002支持与Microsoft SharePoint集成,实现任务分配、状态更新和文件共享等功能。团队成员可以直接在SharePoint上查看和更新任务,提高沟通和协作的效率。 七、学习资源 "Microsoft ...

    microsoftProject 2016 英文版

    project 2016是旗下的一款项目管理软件,作为office套餐中的一员,这款软件可以帮你简化项目、资源和项目组合管理。集成的规划工具有助于跟踪项目并保持井井有条。project2016拥有熟悉的自动日程安排工具,可以帮助...

    MicrosoftProject2003简介

    **Microsoft Project 2003** 是一款专为项目管理和协作设计的应用程序,它可以帮助用户更好地组织和整合商务计划、项目以及资源。通过提供灵活的报表、丰富的图表展示以及强大的分析功能,Project 2003 成为了项目...

    Microsoft Project 003

    Microsoft Project 0021Microsoft Project 0021Microsoft Project 0021Microsoft Project 0021

    参考资料-微软Project2007中文教程.zip

    【描述】: 本压缩包包含了一份详尽的微软Project2007中文教程,旨在帮助用户掌握这款强大的项目管理软件的基本操作和高级功能。 【标签】: Microsoft 【内容详解】 微软Project 2007是一款广泛使用的项目管理工具...

    microsoft project 2010 教程

    microsoft project 2010 教程 可以帮助使用者熟练掌握 项目管理软件

    microsoft project 上机指导 & 教程

    Microsoft Project通过提供时间线、甘特图、资源分配和预算跟踪等功能,帮助项目经理实现这些目标。 进入第2章——Microsoft Project管理项目的一般流程,本章将详细讲解如何使用Project 2003或2007来规划和管理...

    Microsoft Project导出的xml文件结构分析文件

    这个文件里面详细的解释了Microsoft Project导出的xml文件的各种标签的含义,需要使用Microsoft Visual Studio打开。

    Microsoft Office Project 2007

    9. Microsoft Office Project 2007 的产品系列:本书最后还介绍了 Microsoft Office Project 2007 的产品系列,包括 Project Standard、Project Professional、Project Server 和 Project Web Access 等。

Global site tag (gtag.js) - Google Analytics