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. pandas - groupby 深入及数据清洗案例

    import pandas as pd import numpy as np 分割-apply-聚合 大数据的MapReduce The most general-purpose GroupBy me ...

  2. Java使用MD5加密算法,实现等登陆功能

    Java实现MD5加密 为了保护有些数据,就需要采取一些手段来进行数据的加密,防止被别人破解. MD5简介 md5的全称是md5信息摘要算法(英文:MD5 Message-Digest Algorit ...

  3. 《SQL Server 2008 R2》 收缩数据库日志文件

    USE [master] GO /****** Object: StoredProcedure [dbo].[pro_Shrink_Log] Script Date: 2019/8/16 16:56: ...

  4. int数据类型的最大数

    /* 32位系统 */ #include <stdio.h> int main() { , b = ; ) { ; } printf(); ; do { n = n / ; b++; } ...

  5. Linux命令——trap

    简介 trap是shell内置命令,它对硬件信号和其他事件做出响应.trap定义并激活信号处理过程,信号处理过程是当shell接收信号或其他特殊条件时要运行的处理过程. 语法 trap [-lp] [ ...

  6. zz先睹为快:神经网络顶会ICLR 2019论文热点分析

    先睹为快:神经网络顶会ICLR 2019论文热点分析 - lqfarmer的文章 - 知乎 https://zhuanlan.zhihu.com/p/53011934 作者:lqfarmer链接:ht ...

  7. luoguP3704 [SDOI2017]数字表格

    题意 默认\(n\leqslant m\) 所求即为:\(\prod\limits_{i=1}^n\prod\limits_{j=1}^mf[\gcd(i,j)]\) 枚举\(\gcd(i,j)\)变 ...

  8. openjdk11 stretch基础镜像无法找到对应openjdk dbg 包的问题

    今天在构建一个jdk perf 工具基于openjdk 11 发现8 的dbg 一直可以查找到,但是11的就是没有 参考issue https://github.com/docker-library/ ...

  9. 《Three js开发指南》 PDF

    电子版仅供预览及学习交流使用,下载后请24小时内删除,支持正版,喜欢的请购买正版书籍:<Three js开发指南> pdf下载地址:链接: https://pan.baidu.com/s/ ...

  10. [LeetCode] 255. Verify Preorder Sequence in Binary Search Tree 验证二叉搜索树的先序序列

    Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary ...