近期项目中遇到一个需求,需要按照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