using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using net.sf.mpxj;
using net.sf.mpxj.MpxjUtilities;
using net.sf.mpxj.reader;
using System.Data;
namespace ConstructionProcessManage_Mpxj
{
public class MpxjHelper
{
/// <summary>
/// 导入MSProject文件
/// </summary>
/// <param name="filename">文件地址</param>
/// <param name="projectId"></param>
/// <param name="usercode"></param>
/// <param name="dt1">任务列表</param>
/// <param name="dt2">前置任务列表</param>
/// <returns></returns>
public void ImportTasks(string filename, out DataTable dt1, out DataTable dt2)
{
dt1 = GetTableSchema1();
dt2 = GetTableSchema2();
ProjectReader reader = ProjectReaderUtility.getProjectReader(filename);
ProjectFile file = reader.read(filename);
foreach (net.sf.mpxj.Task task in file.Tasks.ToIEnumerable())
{
if (task.ID.toString()=="") //自动创建的节点,一般为文件名,不需要
{
continue;
}
DataRow dr = dt1.NewRow();
DateTime dtstartdate = task.Start.ToDateTime(); //开始时间
DateTime dtenddate = task.Finish.ToDateTime();//结束时间
TimeSpan tspan = dtenddate.Subtract(dtstartdate);
dr["TaskId"] = Guid.Parse(task.GUID.toString());
dr["TaskName"] = task.Name;
dr["Guid"] = null;
dr["Unit"] = "";
dr["TaskDeys"] = tspan.Days + ;
dr["UserNumber"] = ;
dr["EquipmentShow"] = "";
dr["MaterialShow"] = "";
dr["Technology"] = "";
dr["TaskType"] = ;
if (task.ParentTask != null && Convert.ToInt32(task.OutlineLevel.toString())>) //是否根节点,mpp文件必须只有一个根节点,否则会报错
{
dr["ParentId"] = Guid.Parse(task.ParentTask.GUID.toString());
}
dr["PstartDate"] = DateTime.Parse(string.Format("{0:d}", dtstartdate));
dr["PendDate"] = DateTime.Parse(string.Format("{0:d}", dtenddate));
dr["VersionCode"] = projectId;
dr["EditDate"] = DateTime.Now;
dr["Note"] = "";
dr["TasksTatus"] = ;
dr["RStartDate"] = DBNull.Value; //new Nullable<DateTime>();
dr["REndDate"] = DBNull.Value;//new Nullable<DateTime>();
dr["Pstatus"] = ;
dr["TaskPro"] = ;
dr["TaskLevel"] = Convert.ToInt32(task.OutlineLevel.toString())-;
dr["TaskSource"] = ;
dr["SortOrder"] = Convert.ToInt32(task.UniqueID.toString());//0; //task.OutlineLevel;
dr["MileageID"] = ;//---------
dr["RelevanceModel"] = false;
if (task.HasChildTasks())//------------------------------------
{
dr["LeafNode"] = true;
}
else
{
dr["LeafNode"] = false;
}
dr["DelayDays"] = ; dt1.Rows.Add(dr); if (task.Predecessors != null && task.Predecessors.isEmpty() == false)
{
foreach (Relation relation in task.Predecessors.ToIEnumerable())
{
DataRow dr2 = dt2.NewRow();
dr2["RelyId"] = Guid.NewGuid();
dr2["VersionCode"] = projectId;
dr2["TaskId"] = Guid.Parse(relation.SourceTask.GUID.toString());
dr2["RelyTask"] = Guid.Parse(task.GUID.toString());
dr2["RelyType"] = ; //int.Parse(task.Type.ToString());
dr2["CreateDate"] = DateTime.Now;
dt2.Rows.Add(dr2);
}
}
}
} #region 自定义任务表(列必须与数据库表列一一对应,最终采用SqlBulkCopy批量插入)
public DataTable GetTableSchema1()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] {
new DataColumn("TaskId",typeof(Guid)),
new DataColumn("TaskName",typeof(string)),
new DataColumn("Guid",typeof(string)),
new DataColumn("ProjectId",typeof(Int32)), new DataColumn("Unit",typeof(string)),
new DataColumn("TaskDeys",typeof(Int32)),
new DataColumn("UserNumber",typeof(Int32)),
new DataColumn("EquipmentShow",typeof(string)), new DataColumn("MaterialShow",typeof(string)),
new DataColumn("Technology",typeof(string)),
new DataColumn("TaskType",typeof(Int32)),
new DataColumn("ParentId",typeof(Guid)), new DataColumn("PstartDate",typeof(DateTime)),
new DataColumn("PendDate",typeof(DateTime)),
new DataColumn("VersionCode",typeof(string)),
new DataColumn("EditUser",typeof(string)), new DataColumn("EditDate",typeof(DateTime)),
new DataColumn("Note",typeof(string)),
new DataColumn("TasksTatus",typeof(Int32)),
new DataColumn("RStartDate",typeof(DateTime)), new DataColumn("REndDate",typeof(DateTime)),
new DataColumn("PStatus",typeof(Int32)), //
new DataColumn("TaskPro",typeof(decimal)),
new DataColumn("TaskLevel",typeof(Int32)), new DataColumn("TaskSource",typeof(Int32)),
new DataColumn("SortOrder",typeof(Int32)),
new DataColumn("MileageID",typeof(Int32)),//
new DataColumn("RelevanceModel",typeof(bool)), new DataColumn("LeafNode",typeof(bool)),
new DataColumn("DelayDays",typeof(Int32)) });
return dt;
}
#endregion
#region 自定义前置任务表(列必须与数据库表列一一对应,最终采用SqlBulkCopy批量插入)
public DataTable GetTableSchema2()
{
DataTable dt = new DataTable();
dt.Columns.AddRange(new DataColumn[] {
new DataColumn("RelyId",typeof(Guid)),
new DataColumn("VersionCode",typeof(string)),
new DataColumn("TaskId",typeof(Guid)),
new DataColumn("RelyTask",typeof(Guid)), new DataColumn("RelyType",typeof(Int32)),
new DataColumn("CreateDate",typeof(DateTime)),
new DataColumn("CreateUser",typeof(Int32)) });
return dt;
}
#endregion
}
}

Mpxj组件已打包,请在本人百度网盘下载

链接:https://pan.baidu.com/s/1qV2ZgzwsPfY4kH-xPkvRzw
提取码:g9ri

原创文章,转载请注明

脱离Office约束,C#结合Mpxj组件完美解析MSProject(.mpp)文件的更多相关文章

  1. 【Android开发精要笔记】Android组件模型解析

    Android组件模型解析 Android中的Mashup 将应用切分成不同类别的组件,通过统一的定位模型和接口标准将他们整合在一起,来共同完成某项任务.在Android的Mashup模式下,每个组件 ...

  2. 使用element的upload组件实现一个完整的文件上传功能(下)

    本篇文章是<使用element的upload组件实现一个完整的文件上传功能(上)>的续篇. 话不多说,接着上一篇直接开始 一.功能完善—保存表格中每一列的文件列表状态 1.思路 保存表格中 ...

  3. 微信小程序自定义导航栏组件,完美适配所有手机,可实现各种功能和情况

    背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS 手机对于页面 title 的展示不一致,安卓 title 的显示不居中 页面的 title 只支持纯文本级别的样式控 ...

  4. 利用 Aspose.Words 组件,在不依赖与 Office 组件的情况下把 Word 文件转换成 HTML 代码。

    首先利用 Nuget 获取 Aspose.Words.dll public ActionResult AsposeWordsDemo() { string srcFileName = Server.M ...

  5. Axiom3D:Ogre地形组件代码解析

    大致流程. 这里简单介绍下,Axiom中采用的Ogre的地形组件的一些概念与如何生成地形. 先说下大致流程,然后大家再往下看.(只说如何生成地形与LOD,除高度纹理图外别的纹理暂时不管.) 1.生成T ...

  6. React 16 源码瞎几把解读 【二】 react组件的解析过程

    一.一个真正的react组件编译后长啥样? 我们瞎几把解读了react 虚拟dom对象是怎么生成的,生成了一个什么样的解构.一个react组件不光由若干个这些嵌套的虚拟dom对象组成,还包括各种生命周 ...

  7. C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析

    看到这篇文章的题目,估计很多人都会问,这个组件是不是有些显的无聊了,说到web通信,很多人都会想到ASP.NET SignalR,或者Nodejs等等,实现web的网络实时通讯.有关于web实时通信的 ...

  8. 使用element的upload组件实现一个完整的文件上传功能(上)

    说到标题就有点心塞了,前段时间项目上需要实现一个文件上传的功能,然后就咔咔的去用了element的upload组件,不用不知道一用吓一跳哇. 在使用的过程中遇到了很多让意想不到的问题,后来也因为时间问 ...

  9. POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)

    实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...

随机推荐

  1. 005-OpenStack-网络服务

    OpenStack-网络服务 [基于此文章的环境]点我快速打开文章 1.控制节点(controller) 1.1 创库授权 neutron mysql CREATE DATABASE neutron; ...

  2. 初识v4l2(四)-------v4l2_open、v4l2_read、v4l2_write浅析

    原文:https://blog.csdn.net/leesagacious/article/details/49995729 1.app:     open("/dev/video0&quo ...

  3. 201871010106-丁宣元 《面向对象程序设计(java)》第十三周学习总结

    201871010106-丁宣元 <面向对象程序设计(java)>第十三周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...

  4. python -m pip install --upgrade pip

    升级pip后报错 TypeError: 'module' object is not callable 原因 存在两个版本的pip 先把原先版本的卸载了: python -m pip uninstal ...

  5. Linux下Nginx的安装(二)

    一.安装Nginx ## 安装前准备 ## #GNU编译器集合 #Nginx编译需要PCRE #在Nginx的各种模块中需要使用gzip压缩 #在Nginx中,如果服务器提供安全网页时则会用到Open ...

  6. django之choice、ajax初步

    django之choice参数,ajax choice参数 应用场景:主要是用户性别.用户工作状态.成绩对应 ##在测试文件中运行,需要写以下几个模块 if __name__ == "__m ...

  7. HttpRequest对象

    在面向对象的语言中,有种“万物皆对象”的说法.在上篇文章中介绍了HttpRuntime类,在该类收到请求之后,立即通过HttpWorkerRequest工作者对象对传递的参数进行分析和分解,创建方便网 ...

  8. 怎么删除STL容器的元素

    在STL容器有顺序容器和关联容器两种. 顺序容器删除元素的方法有两种: 1.c.erase(p) 从c中删除迭代器p指定的元素.p必须指向c中一个真实元素,不能等于c.end().返回一个指向p之后元 ...

  9. CSP考前复习

    前言 因为loceaner太菜了,他什么东西都不会 所以他打算学一个东西就记录一下 不过因为他很菜,所以他不会写原理-- 而且,他希望在2019CSP之前不会断更 就酱紫,就是写给他自己的--因为他太 ...

  10. 热情组——项目冲刺 Day1

    项目相关 作业相关 具体描述 班级 班级链接 作业要求 链接地址 团队名称 热情组 作业目标 实现软件的生成,以及在福大的传播 Github链接 链接地址 SCRUM部分: 成员昵称 昨日目标 昨日进 ...