
本教程旨在解决使用mpxj库在java中生成ms project xml(mspdi)文件时,无法默认显示“工作”和“id”等特定列的问题。文章将深入探讨mpxj在数据生成与视图配置方面的局限性,并提供多种解决方案,重点介绍如何通过结合mpxj生成的数据与预设的ms project模板文件,实现所需列的自动显示,同时也会提及其他替代方案如aspose.tasks和vba自动化。
在使用Java的MPXJ库生成Microsoft Project兼容的XML文件(MSPDI格式)时,开发者常常会遇到一个挑战:虽然所有任务、资源和分配数据都已正确写入文件,但在MS Project中打开该文件时,某些关键列(例如“工作”和“ID”)并不会自动显示,需要用户手动选择并添加。
MPXJ库主要专注于项目数据的读取、创建和修改。它能够有效地处理任务、资源、日历、依赖关系等项目管理核心数据,并将这些数据序列化为多种格式,包括MSPDI XML。然而,MSPDI XML文件本身并不包含MS Project应用程序的“视图”或“显示设置”信息。MS Project在打开MSPDI文件时,通常会应用其默认视图设置,而这些设置可能不包含所有你希望默认显示的列。换句话说,MPXJ负责生成数据,而MS Project的视图配置则独立于数据文件。
以下代码片段展示了如何使用MPXJ创建任务并设置其属性,包括“工作”和“ID”等数据。这些数据会正确地存储在生成的MSPDI文件中,但如何让MS Project默认显示这些数据,是本文要解决的核心问题。
import net.sf.mpxj.ProjectFile;
import net.sf.mpxj.Task;
import net.sf.mpxj.Resource;
import net.sf.mpxj.ResourceAssignment;
import net.sf.mpxj.Duration;
import net.sf.mpxj.TaskType;
import net.sf.mpxj.TimeUnit;
import java.util.Date;
import java.util.Objects;
public class MpxjTaskCreationExample {
public void createProjectData(ProjectFile project, YourExtractedRowData extractedRowData) {
Task element = null;
Task workpackage = null;
Task task = null;
ResourceAssignment assn;
int id = 1; // Assuming ID starts from 1 and increments
// Example: Assuming project and extractedRowData are properly initialized
// For demonstration, we'll simulate some data processing
Date startingDate = new Date(); // Replace with actual starting date
if (!extractedRowData.getElement().isEmpty()) {
element = project.addTask();
element.setName(extractedRowData.getElement());
element.setStart(startingDate);
element.setOutlineLevel(1); // Assuming a lookup for outline level
element.setID(id++);
} else if (!extractedRowData.getWorkpackage().isEmpty()) {
workpackage = Objects.requireNonNull(element).addTask();
workpackage.setName(extractedRowData.getWorkpackage());
workpackage.setOutlineLevel(2); // Assuming a lookup
workpackage.setID(id++);
} else if (!extractedRowData.getTask().isEmpty()) {
task = Objects.requireNonNull(workpackage).addTask();
task.setName(extractedRowData.getTask());
task.setType(TaskType.FIXED_WORK);
task.setOutlineLevel(3); // Assuming a lookup
task.setWork(Duration.getInstance(extractedRowData.getEstimatedTime(), TimeUnit.HOURS));
task.setDuration(Duration.getInstance(extractedRowData.getEstimatedTime() / 8, TimeUnit.DAYS));
task.setRemainingWork(Duration.getInstance(extractedRowData.getEstimatedTime(), TimeUnit.HOURS));
task.setID(id++);
if (!extractedRowData.getRole().isEmpty()) {
for (Resource resource : project.getResources()) {
if (resource.getName().equals("MappedRoleName")) { // Replace with actual mapping
assn = Objects.requireNonNull(task).addResourceAssignment(resource);
assn.setStart(task.getStart());
assn.setWork(Duration.getInstance(extractedRowData.getEstimatedTime(), TimeUnit.HOURS));
}
}
}
}
}
// Placeholder for your data row structure
static class YourExtractedRowData {
String element = "";
String workpackage = "";
String task = "";
int estimatedTime = 0;
String role = "";
// Getters for element, workpackage, task, estimatedTime, role
public String getElement() { return element; }
public String getWorkpackage() { return workpackage; }
public String getTask() { return task; }
public int getEstimatedTime() { return estimatedTime; }
public String getRole() { return role; }
}
}由于MSPDI文件本身不承载视图信息,我们需要采用间接方法来达到默认显示特定列的目的。以下是几种可行的策略:
立即学习“Java免费学习笔记(深入)”;
这是在使用MPXJ生成数据的前提下,实现所需视图配置的最有效方法。核心思想是利用MS Project的导入功能,将MPXJ生成的MSPDI数据合并到一个预先配置好视图的MPP模板文件中。
步骤:
创建MS Project模板文件:
使用MPXJ生成MSPDI文件:
// ... (Your MPXJ data generation code, as shown above) ... // Example of writing the ProjectFile to MSPDI XML ProjectFile project = new ProjectFile(); // Populate project with tasks, resources, etc. using your data // ... // Create a ProjectWriter for MSPDI XML ProjectWriter writer = ProjectWriterUtility.get :-project.getFormat(), "MSPDI"); writer.write(project, "output_data.xml"); // This is your MSPDI file
在MS Project中导入MSPDI文件并应用模板:
注意事项:
一些商业级的项目管理库,如Aspose.Tasks for Java,可能提供更高级的功能,包括直接控制生成的MPP文件的视图设置。这些库通常能够生成原生MPP文件,而不是MSPDI XML,因此可能拥有更多对MS Project内部结构的访问权限。
优点:
缺点:
如果你在Excel中处理数据,并且目标是直接在MS Project中生成和配置项目,那么VBA(Visual Basic for Applications)是一个强大的自动化工具。你可以编写VBA宏来:
优点:
缺点:
MPXJ在处理项目数据方面表现出色,但它本身不提供直接控制MS Project视图配置的功能。要实现生成文件时默认显示“工作”和“ID”等列,最实用且与MPXJ兼容的策略是结合MPXJ生成的数据与一个预先配置好视图的MS Project模板文件,并通过MS Project的导入功能进行合并。这种方法将数据生成(MPXJ)与视图配置(MS Project模板)解耦,提供了一个可行的工作流程。对于需要更高级自动化或原生MPP文件视图控制的场景,可以考虑Aspose.Tasks等商业库或利用VBA进行深度定制。
以上就是使用MPXJ在Java中生成MS Project文件并默认显示特定列的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号