有需求就有解决方案,早上还没有听说过什么是 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 的,哈哈)

如有问题,请留言或及时联系本人。

01-19 11:24