java导出mpp(ms project)文件方法:通过jacob按mpp模板格式导出数据

近期项目中遇到一个需求,需要按照mpp模板的格式导出mpp文件。

经网上多番查找,也未能找到可用方案,几经摸索,终得以实现,特记录在此,供有缘人查看~

如需转载,请注明出处~

 

一、导出思路:

JACOB一个Java-COM中间件,通过这个组件可以在Java应用程序中调用COM组件和Win32程序库

1、通过jacob打开mpp模板,此时会调用服务器上安装的project软件来打开mpp模板,所以要先安装 microsoft project软件

2、获取mpp模板的project、tasks,并在tasks中新增任务

3、将mpp模板另存为mpp文件

 

二、代码如下:

 import com.jacob.activeX.ActiveXComponent;
 import com.jacob.com.Dispatch;
 import com.jacob.com.Variant;

    //导出mpp文件
    private void exportMpp(){
        String mppTemplate = "mpp模板.mpp";
        String mpp = "mpp文件.mpp";     

        //打开mpp模板
        Dispatch.call(activexComponent, "FileOpen", new Object[] { mppTemplate });       

        //获取project
        Dispatch project = activexComponent.getProperty("ActiveProject").toDispatch();   
        //获取task集合
        Dispatch tasks = Dispatch.get(project, "Tasks").toDispatch();

   //新增任务1
        Dispatch task1 = Dispatch.call(tasks, "Add").toDispatch();
        //设置任务1字段
        Dispatch.put(task1, "WBS", "1");
        Dispatch.put(task1, "Name", "TASK1");
        Dispatch.put(task1, "Notes", "备注字段");
        Dispatch.put(task1, "Text1", "文本字段1");
        Dispatch.put(task1, "ResourceNames", "SE");
        Dispatch.put(task1, "Start", "2021年1月1日");
        Dispatch.put(task1, "Finish", "2021年1月20日");

        Dispatch.put(task1, "Duration", 1);
        Dispatch.put(task1, "PercentWorkComplete", "11");  
        ......

   //新增任务2
        Dispatch task2 = Dispatch.call(tasks, "Add").toDispatch();
        //设置任务2字段
        Dispatch.put(task2, "WBS", "1.1");
        Dispatch.put(task2, "Name", "TASK2");      
        //降级任务2,即设置任务2为任务1的子任务
        Dispatch.call(task2, "OutlineIndent");
        
        //新增任务3
        Dispatch task3 = Dispatch.call(tasks, "Add").toDispatch();   
        Dispatch.put(task3, "WBS", "1.2");
        Dispatch.put(task3, "Name", "TASK3");

   //新增任务4
        Dispatch task4 = Dispatch.call(tasks, "Add").toDispatch();   
        Dispatch.put(task4, "WBS", "1.3");
        Dispatch.put(task4, "Name", "TASK4");     

   //新增任务5
        Dispatch task5 = Dispatch.call(tasks, "Add").toDispatch();   
        Dispatch.put(task5, "WBS", "1.3.1");
        Dispatch.put(task5, "Name", "TASK5");
        //降级任务5,即设置任务5为任务4的子任务
        Dispatch.call(task5, "OutlineIndent");                 

   //新增任务6
        Dispatch task6 = Dispatch.call(tasks, "Add").toDispatch();   
        Dispatch.put(task6, "WBS", "1.4");
        Dispatch.put(task6, "Name", "TASK6");
        //升级任务6,即设置任务6为任务1的子任务
        Dispatch.call(task6, "OutlineOutdent");
        

   //另存为Mpp文件
        Dispatch.call(activexComponent, "FileSaveAs",new Object[] { mpp });
        //关闭文件
        activexComponent.invoke("FileClose", new Variant[]{});
        //退出
        activexComponent.invoke("Quit", new Variant[]{});

 }

 

三、project接口文档:可查询project对应的方法和属性

https://docs.microsoft.com/zh-cn/office/vba/api/project.task.outlineindent

 

四、jacob指令:用于访问COM/DLL对象的方法,读取、修改COM/DLL对象的属性。
call method:属于Dispatch类。用于访问COM/DLL对象的方法。方法进行了重载,方便不同场合调用。返回一个Variant类型的值。
callSub method:使用方法和call一样,不过它不返回值。
get method:读取COM对象的属性值,返回一个Variant类型值。
put method:设置COM对象的属性值。
invoke method:call的另一种用法,更复杂一些。
invokesub method:subcall的另一种用法
getProperty method:属于ActiveXComponent类,读取属性值,返回一个Variant类型值。
setProperty method:属于ActiveXComponent类,设置属性值。

五、microsoft project软件下载资源

http://t.zoukankan.com/tangbohu2008-p-13534755.html

http://yimiaozhongdemeng.com/jianshu-com-p-8382d145e0fb.html

 

上一篇:物联网平台自建或外部购买应谨慎评估


下一篇:对于React各种状态管理器的解读