有需求就有解决方案,早上还没有听说过什么是 mpp 文件,下午已经能成功的将功能实现,这难道就是程序员的职业素养?哈哈哈哈
从网上找了很多方法,最后自己找到一个十分简单的打开 mpp 文件的方法:
public void readMpp() { Object missing = Type.Missing; ApplicationClass prj = new ApplicationClass(); prj.FileOpen("C:/Users/a001/Desktop/项目1.mpp", false, missing, missing, missing, missing, missing, missing, missing, missing, missing, PjPoolOpen.pjPoolReadWrite, missing, missing, missing, missing); System.Threading.Thread.Sleep(2000);//睡眠两秒 string strmpp = ""; foreach (Project proj in prj.Projects) { foreach (Microsoft.Office.Interop.MSProject.Task task in proj.Tasks) { if (task == null) continue; //strmpp += "任务名称:" + task.Name + "," + task.UniqueID + ",资源名称:" + task.ResourceNames + "\r\n";//用ajax来请求的时候,此格式非json格式,会报错 strmpp += "任务名称:" + task.Name + "," + task.UniqueID + ",资源名称:" + task.ResourceNames;//正确方法 } } prj.FileClose(PjSaveType.pjSave, false);//关闭 prj.Quit(PjSaveType.pjSave);//关闭 Response.Write(string.Format("{{ \"errorcode\": {0}, \"errormessage\": \"{1}\" }}", 1000, strmpp)); }
注意:
1、使用C#的这种方法打开 mpp 文件时,电脑上必须安装 Microsoft object 这个软件(在测试时本人打开线程观测结果:会先将 Microsoft object 软件打开,而后关闭)
问题:
1、ApplicationClass 提示无法嵌入互操作类型,请改用使用的接口,如下:
解决方案是:将引用 Microsoft.Office.Interop.MSProject 的属性中的 “嵌入互操作类型” 改为false 如下:
2、上述代码中提到了要线程睡眠两秒,是因为我的 Microsoft object 软件未激活,会提示我是否激活,将这个会话框关闭才能读取到 mpp 文件中的数据,否则将会报错(睡眠两秒的意义就在于给我两秒钟的时间我去关闭这个会话窗,再说一点,激活是要 rmb 的,哈哈)
如有问题,请留言或及时联系本人。