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. Apache:系统找不到指定的文件: No installed ConfigArgs for the service "Apache2"

    解决方法: 将以下内容保存成FixApacheError.reg文件(其中红色粗体Apache2改成报错的系统服务名称,如"RTX_HTTPServer"),导入系统注册表 Fix ...

  2. tensorflow模型量化实例

    1,概述 模型量化应该是现在最容易实现的模型压缩技术,而且也基本上是在移动端部署的模型的毕竟之路.模型量化基本可以分为两种:post training quantizated和quantization ...

  3. 201871010125 王玉江 《面向对象程序设计(Java)》第八周实验总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  4. Ubuntu16.04安装deb包

    在Ubuntu下安装deb包需要使用dpkg命令.Dpkg 的普通用法: 1.sudo dpkg -i <package.deb> 安装一个 Debian 软件包,如你手动下载的文件. 2 ...

  5. 跨交换机VLAN之间的通信(基于Cisco模拟器)

    实验要求: 拓扑结构如下 1.交换机2台:主机4台:网线若干. 2.把主机.交换机进行互联. 3.给2台交换机重命名为A.B. 4.设置2台交换机及主机的ip.注意IP要不冲突 5.在2台交换机上分别 ...

  6. css网格布局

    先来一段基本布局 <!doctype html> <html> <head> <meta charset="utf-8"> < ...

  7. bootstrap-table 列拖动

    1.页面js/css <!-- bootstrap 插件样式 --> <link th:href="@{/common/bootstrap-3.3.6/css/bootst ...

  8. read articles list

    done 如何通俗易懂地解释卷积: https://www.zhihu.com/question/22298352/answer/637156871 如何通俗易懂地理解卷积神经网路: http://w ...

  9. VIPKID:笔试题(数组中和为0的一对数的数量,十进制转二进制中1的个数)

    1. 求数组中的和为0 的一对数的数量 注意,需要用到set import java.util.Scanner; public class Main{ public static void main( ...

  10. 【网络知识之六】UDP

    UDP(User Datagram Protocol)用户数据报协议,是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务. 一.UDP报头UDP报头由4个部分组成,其中两个是可选的(粉红背 ...