脱离Office约束,C#结合Mpxj组件完美解析MSProject(.mpp)文件
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)文件的更多相关文章
- 【Android开发精要笔记】Android组件模型解析
Android组件模型解析 Android中的Mashup 将应用切分成不同类别的组件,通过统一的定位模型和接口标准将他们整合在一起,来共同完成某项任务.在Android的Mashup模式下,每个组件 ...
- 使用element的upload组件实现一个完整的文件上传功能(下)
本篇文章是<使用element的upload组件实现一个完整的文件上传功能(上)>的续篇. 话不多说,接着上一篇直接开始 一.功能完善—保存表格中每一列的文件列表状态 1.思路 保存表格中 ...
- 微信小程序自定义导航栏组件,完美适配所有手机,可实现各种功能和情况
背景 在做小程序时,关于默认导航栏,我们遇到了以下的问题: Android.IOS 手机对于页面 title 的展示不一致,安卓 title 的显示不居中 页面的 title 只支持纯文本级别的样式控 ...
- 利用 Aspose.Words 组件,在不依赖与 Office 组件的情况下把 Word 文件转换成 HTML 代码。
首先利用 Nuget 获取 Aspose.Words.dll public ActionResult AsposeWordsDemo() { string srcFileName = Server.M ...
- Axiom3D:Ogre地形组件代码解析
大致流程. 这里简单介绍下,Axiom中采用的Ogre的地形组件的一些概念与如何生成地形. 先说下大致流程,然后大家再往下看.(只说如何生成地形与LOD,除高度纹理图外别的纹理暂时不管.) 1.生成T ...
- React 16 源码瞎几把解读 【二】 react组件的解析过程
一.一个真正的react组件编译后长啥样? 我们瞎几把解读了react 虚拟dom对象是怎么生成的,生成了一个什么样的解构.一个react组件不光由若干个这些嵌套的虚拟dom对象组成,还包括各种生命周 ...
- C#实现WebSocket协议客户端和服务器websocket sharp组件实例解析
看到这篇文章的题目,估计很多人都会问,这个组件是不是有些显的无聊了,说到web通信,很多人都会想到ASP.NET SignalR,或者Nodejs等等,实现web的网络实时通讯.有关于web实时通信的 ...
- 使用element的upload组件实现一个完整的文件上传功能(上)
说到标题就有点心塞了,前段时间项目上需要实现一个文件上传的功能,然后就咔咔的去用了element的upload组件,不用不知道一用吓一跳哇. 在使用的过程中遇到了很多让意想不到的问题,后来也因为时间问 ...
- POI完美解析Excel数据到对象集合中(可用于将EXCEL数据导入到数据库)
实现思路: 1.获取WorkBook对象,在这里使用WorkbookFactory.create(is); // 这种方式解析Excel.2003/2007/2010都没问题: 2.对行数据进行解析 ...
随机推荐
- Jenkins 打tag回滚
利用jenkins,从gitlab上拉取代码,然后发布,如果想进行代码回退,其实还是代码发布,拉取的时候,选择合适的标签. 一.利用Git parameter插件选择branch或tag.下面的文本参 ...
- vue 开发系列(九) VUE 动态组件的应用
业务场景 我们在开发表单的过程中会遇到这样的问题,我们选择一个控件进行配置,控件有很多中类型,比如文本框,下来框等,这些配置都不同,因此需要不同的配置组件来实现. 较常规的方法是使用v-if 来实现, ...
- centos7 升级php7 添加配置epel源 报错:Cannot retrieve metalink for repository: epel. Please verify its path and try again
文章来自:循序渐渐linux:基础知识 一书 7.3章LAMP服务器搭建 日常故障 centos上好多软件升级需要配置epel源 其中有一点小插曲 需要手动更改 1.很多时候,对PHP环境要求较新的版 ...
- mysql的floor()报错注入方法详细分析
刚开始学习sql注入,遇见了 select count(*) from table group by floor(rand(0)*2); 这么条语句.在此做个总结. (更好的阅读体验可访问 这里 ) ...
- jQuery的DataTables中的TableTools的基本使用
DataTables的TableTools插件提供复制,导出excel.pdf,打印等功能. DataTables官网:http://datatables.net TableTools示例:http: ...
- oracle 行转列~列转行(几种方法)
工作中,我们经常会碰到行转列的情况 这里我介绍几种简单的方法--行转列 1.oracle的pivot函数 原表 使用pivot函数: with temp as(select '四川省' nation ...
- day6_7.4总结数据类型的可变不可变
续昨天: 列表的常用方法: 1.chear() 用途:清空列表,其返回值无,返回none. list1=[1,2,3,4,5] a=list1.clear() print(list1) print(a ...
- Linux下Nginx的安装(二)
一.安装Nginx ## 安装前准备 ## #GNU编译器集合 #Nginx编译需要PCRE #在Nginx的各种模块中需要使用gzip压缩 #在Nginx中,如果服务器提供安全网页时则会用到Open ...
- VmWare下Ubuntu扩容问题
出现问题:拉不动,扩展不了分区大小: 解决:首先在设置了里面扩大硬盘大小: 之后下载Gparted工具:gparted-live-0.8.0-5.iso(下载地址:https://pan.baidu. ...
- hdu1495-非常可乐-(倒水问题bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1495 题解: 1.最少次数?江湖套路,bfs.2.怎么倒?从一个杯子倒到另一个杯子.3.倒多少?因为没有刻度,所 ...