脱离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.对行数据进行解析 ...
随机推荐
- osi7层
- 解决eclipse中maven多模块项目显示不全的问题
背景:在eclipse中导入maven项目,后来发现有的子模块不能正常的显示出现 原因:没有加载到子模块的pom文件 解决方法:重新导入:import-> 勾选项目->选择你缺少的项目的p ...
- my.cnf配置文件实用优化
[client] 1.登陆过程自动化(这样做可以让你在命令行登陆的时候免去输入用户名和密码) host="mysql服务器地址" user="用户名" pass ...
- 关于苹果macOS更新到Catalina后出现的各种问题(持续更新)
一.Mac系统更新后 Git 不能用,提示 missing xcrun at:xxx xcrun: error: invalid active developer path (/Library/Dev ...
- Minimum Barrier Salient Object Detection at 80 FPS 论文阅读笔记
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...
- <人人都懂设计模式>-单例模式
这个模式,我还是了解的. 书上用了三种不同的方法. class Singleton1: # 单例实现方式1 __instance = None __is_first_init = False def ...
- 每天一套题打卡|河南省第七届ACM/ICPC
A 海岛争霸 题目:Q次询问,他想知道从岛屿A 到岛屿B 有没有行驶航线,若有的话,所经过的航线,危险程度最小可能是多少. 多源点最短路,用floyd 在松弛更新:g[i][k] < g[i][ ...
- 201871010106-丁宣元 《面向对象程序设计(java)》第十六周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第十六周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nw ...
- 杂项-FLAG
题目 最低位隐写 50 4B 03 04 压缩格式zip的文件头 save bin 保存成zip格式 解压(WinRAR不能正常解压) 然后用vim打开(winhex也可以) hctf{dd0gf4c ...
- Access-Control-Allow-Origin 响应一个携带身份信息(Credential)的HTTP请求时,必需指定具体的域,不能用通配符
https://www.cnblogs.com/raind/p/10771778.html Access-Control-Allow-Origin.HTTP响应头,指定服务器端允许进行跨域资源访问的来 ...