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()=="0") //自動建立的節點,通常爲文件名,不須要 { 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 + 1; dr["UserNumber"] = 0; dr["EquipmentShow"] = ""; dr["MaterialShow"] = ""; dr["Technology"] = ""; dr["TaskType"] = 0; if (task.ParentTask != null && Convert.ToInt32(task.OutlineLevel.toString())>1) //是否根節點,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"] = 0; dr["RStartDate"] = DBNull.Value; //new Nullable<DateTime>(); dr["REndDate"] = DBNull.Value;//new Nullable<DateTime>(); dr["Pstatus"] = 0; dr["TaskPro"] = 0; dr["TaskLevel"] = Convert.ToInt32(task.OutlineLevel.toString())-1; dr["TaskSource"] = 1; dr["SortOrder"] = Convert.ToInt32(task.UniqueID.toString());//0; //task.OutlineLevel; dr["MileageID"] = 0;//--------- dr["RelevanceModel"] = false; if (task.HasChildTasks())//------------------------------------ { dr["LeafNode"] = true; } else { dr["LeafNode"] = false; } dr["DelayDays"] = 0; 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"] = 0; //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
提取碼:g9riui
原創文章,轉載請註明 spa