使用 Java 阅读项目的甘特图

MS Project 是一款流行的项目管理软件,广泛用于有效地组织、管理和跟踪项目活动。它允许创建任务、添加资源、将任务分配给资源、监控进度以及管理与预算相关的活动。甘特图视图是项目的默认视图。它列出了项目任务并显示了它们之间的关系。它还使用甘特条显示项目的时间表。在本文中,我们将学习如何使用 Java 阅读 MS 项目的甘特图。

本文将涵盖以下主题:

Microsoft Project 中的甘特图是什么

甘特图是一种显示项目进度的条形图。它是项目任务与时间的关系的图形表示,并提供了整个项目的鸟瞰图。 Microsoft Project 中的甘特图视图显示以下内容:

  • 项目进度
  • 时间估计
  • 项目资源和团队成员
  • 任务优先级
  • 任务依赖
Gantt Chart View of a Project in Microsoft Project.

Java API 读取项目甘特图

为了从 MPP 文件中读取项目的甘特图视图,我们将使用 Aspose.Tasks for Java API。它允许在 Java 应用程序中以编程方式创建、编辑或操作 Microsoft Project 文件。 API 的 Project 类代表一个项目。它是公开各种方法以执行不同功能的主要类。它还允许读取受支持的项目管理格式之一,例如 MPP、MPTMPXXML。 API 的 GanttChartView 类表示甘特图视图。它公开了以编程方式处理甘特图的各种属性和方法。

下载 API 的 JAR 或在基于 Maven 的 Java 应用程序中添加以下 pom.xml 配置。

<repository>
    <id>AsposeJavaAPI</id>
    <name>Aspose Java API</name>
    <url>http://repository.aspose.com/repo/</url>
</repository>
<dependency>
    <groupId>com.aspose</groupId>
    <artifactId>aspose-tasks</artifactId>
    <version>22.5</version>
    <classifier>jdk18</classifier>
</dependency>

阅读甘特图视图并检索条形样式

API 的 GanttBarStyle 类表示 MS Project 在甘特图视图中使用的条形样式。我们可以按照以下步骤阅读甘特图视图并检索条形样式:

  1. 首先,使用 Project 类加载项目文件。
  2. 接下来,通过索引从 ViewCollection 中获取默认视图。
  3. 然后,创建 GanttChartView 类和类型转换视图的实例。
  4. (可选)读取基本属性并显示数据。
  5. 之后,使用 getBarStyles() 获取甘特图视图的条形样式列表。
  6. 最后,将条形样式作为 GanttBarStyle 类对象循环并显示值。

以下代码示例显示了如何在 Java 中读取甘特图视图的条形样式。

public static void main(String[] args) throws Exception
{
    // 文档目录的路径。
    String dataDir = "C:\\Files\\Tasks\\";

    // 加载项目
    Project project = new Project(dataDir + "Project.mpp");

    // 获取默认视图为 GanttChartView
    View view = project.getViews().toList().get(0);
    GanttChartView gcView = (GanttChartView) view;

    // 显示基本信息
    System.out.println("Bar Rounding: " + gcView.getBarRounding());
    System.out.println("Show Bar Splits: " + gcView.getShowBarSplits());
    System.out.println("Show Drawings: " + gcView.getShowDrawings());
    System.out.println("RollUp Gantt Bars: " + gcView.getRollUpGanttBars());
    System.out.println("Hide Rollup Bars When Summary Expanded: " + gcView.getHideRollupBarsWhenSummaryExpanded());
    System.out.println("Bar Size: " + gcView.getBarSize());
    System.out.println("Bar Styles count: " + gcView.getBarStyles().size());
    System.out.println("-----------------------------------------------");

    // 显示栏样式
   for (GanttBarStyle barStyle : gcView.getBarStyles())
    {	
      System.out.println("Row: " +  barStyle.getRow());
        System.out.println("Name: " +  barStyle.getName());
        System.out.println("ShowFor: " +  barStyle.getShowForTaskUid());
        System.out.println("From:" +  getbarStylesFromToName(barStyle.getFrom()));
        System.out.println("To:" +   getbarStylesFromToName(barStyle.getTo()));
        System.out.println("Middle Shape:" +   getbarStylesMiddleShapeName(barStyle.getMiddleShape()));
        System.out.println("Middle Shape Color:" + barStyle.getMiddleShapeColor());
        System.out.println("Start Shape:" +   getbarStylesShapeName(barStyle.getStartShape()));
        System.out.println("End Shape:" +   getbarStylesShapeName(barStyle.getEndShape()));
        System.out.println("End Shape Color:" + barStyle.getEndShapeColor());
        System.out.println("-----------------------------------------------");
    }
}

// 此函数返回字段名称
private static String getbarStylesFromToName(int val) throws IllegalArgumentException, IllegalAccessException {
  String name = null;
  java.lang.reflect.Field[] fields = Field.class.getDeclaredFields();
 for (java.lang.reflect.Field f : fields) {
    int fVal = f.getInt(f);
      if( fVal == val)
      {
        name = f.getName();
      }
  }
  return name;
}

// 此函数返回中间形状名称
private static String getbarStylesMiddleShapeName(int val) throws IllegalArgumentException, IllegalAccessException {
  String name = null;
  java.lang.reflect.Field[] fields = GanttBarMiddleShape.class.getDeclaredFields();
 for (java.lang.reflect.Field f : fields) {
    int fVal = f.getInt(f);
      if( fVal == val)
      {
        name = f.getName();
      }
  }
  return name;
}

// 此函数返回开始或结束形状名称
private static String getbarStylesShapeName(int val) throws IllegalArgumentException, IllegalAccessException {
  String name = null;
  java.lang.reflect.Field[] fields = GanttBarEndShape.class.getDeclaredFields();
 for (java.lang.reflect.Field f : fields) {
    int fVal = f.getInt(f);
      if( fVal == val)
      {
        name = f.getName();
      }
  }
  return name;
}
Bar Rounding: true
Show Bar Splits: true
Show Drawings: true
RollUp Gantt Bars: false
Hide Rollup Bars When Summary Expanded: false
Bar Size: 3
Bar Styles count: 40
-----------------------------------------------
Row: 1
Name: Task
ShowFor: null
From:TaskStart
To:TaskFinish
Middle Shape:RectangleBar
Middle Shape Color:java.awt.Color[r=0,g=0,b=255]
Start Shape:NoBarEndShape
End Shape:NoBarEndShape
End Shape Color:java.awt.Color[r=0,g=0,b=0]
-----------------------------------------------
...

在 Java 中读取甘特图视图的网格线

API 的 Gridlines 类表示出现在甘特图视图中的网格线。我们可以按照以下步骤读取网格线的颜色、间隔、图案和类型:

  1. 首先,使用 Project 类加载项目文件。
  2. 接下来,通过索引从 ViewCollection 中获取默认视图。
  3. 然后,创建 GanttChartView 类和类型转换视图的实例。
  4. 之后,使用 getGridlines() 获取甘特图视图的网格线列表。
  5. 最后,将网格线作为 Gridlines 类对象循环并显示值。

以下代码示例展示了如何在 Java 中读取甘特图视图的网格线。

public static void main(String[] args) throws Exception
{
    // 文档目录的路径。
    String dataDir = "C:\\Files\\Tasks\\";

    // 加载项目
    Project project = new Project(dataDir + "Project.mpp");

    // 获取默认视图为 GanttChartView
    GanttChartView gcView = (GanttChartView) project.getViews().toList().get(0);

    // 显示网格线信息
    System.out.println("Gridlines Count: " + gcView.getGridlines().size());
    Gridlines gridlines = gcView.getGridlines().get(0);

    System.out.println("Gridlines Type: " + gridlines.getType());
    System.out.println("Gridlines Interval: " + gridlines.getInterval());
    System.out.println("Gridlines NormalColor: " + gridlines.getNormalColor());
    System.out.println("Gridlines NormalPattern: " + getLinePatternName(gridlines.getNormalPattern()));
    System.out.println("Gridlines IntervalPattern: " +gridlines.getIntervalPattern());
    System.out.println("Gridlines IntervalColor: " + gridlines.getIntervalColor());
}

// 此函数返回线模式名称
private static String getLinePatternName(int val) throws IllegalArgumentException, IllegalAccessException {
  String name = null;
  java.lang.reflect.Field[] fields = LinePattern.class.getDeclaredFields();
 for (java.lang.reflect.Field f : fields) {
    int fVal = f.getInt(f);
      if( fVal == val)
      {
        name = f.getName();
      }
  }
  return name;
}
Gridlines Count: 14
Gridlines Type: 3
Gridlines Interval: 0
Gridlines NormalColor: java.awt.Color[r=192,g=192,b=192]
Gridlines NormalPattern: Solid
Gridlines IntervalPattern: 0
Gridlines IntervalColor: java.awt.Color[r=192,g=192,b=192]

在Java中提取甘特图视图的文本样式

API 的 TextStyle 类表示甘特图视图中项目的文本的视觉样式。我们可以按照以下步骤读取颜色、背景颜色、字体和字体样式:

  1. 首先,使用 Project 类加载项目文件。
  2. 接下来,通过索引从 ViewCollection 中获取默认视图。
  3. 然后,创建 GanttChartView 类和类型转换视图的实例。
  4. 之后,使用 getTextStyles() 获取甘特图视图的文本样式列表。
  5. 最后,为第一个文本样式初始化 TextStyle 类对象并显示值。

以下代码示例显示了如何在 Java 中读取甘特图视图的文本样式。

public static void main(String[] args) throws Exception
{
    // 文档目录的路径。
    String dataDir = "C:\\Files\\Tasks\\";

    // 加载项目
    Project project = new Project(dataDir + "Project.mpp");

    // 获取默认视图为 GanttChartView
    GanttChartView gcView = (GanttChartView) project.getViews().toList().get(0);

    // 显示文本样式信息
    System.out.println("Text Styles Count: " + gcView.getTextStyles().size());
    TextStyle textStyle = gcView.getTextStyles().get(0);

    System.out.println("Background Color: " + textStyle.getBackgroundColor());
    System.out.println("Text Color: " + textStyle.getColor());
    System.out.println("Font Family: " + textStyle.getFont().getFontFamily());
    System.out.println("Font Size: " + textStyle.getFont().getSize());
    System.out.println("Font Style: " + getFontStyleName(textStyle.getFont().getStyle()));
}

// 此函数返回字体样式名称
private static String getFontStyleName(int val) throws IllegalArgumentException, IllegalAccessException {
  String name = null;
  java.lang.reflect.Field[] fields = FontStyles.class.getDeclaredFields();
 for (java.lang.reflect.Field f : fields) {
    int fVal = f.getInt(f);
      if( fVal == val)
      {
        name = f.getName();
      }
  }
  return name;
}
Text Styles Count: 19
Background Color: java.awt.Color[r=0,g=0,b=0]
Text Color: java.awt.Color[r=0,g=0,b=255]
Font Family: Arial
Font Size: 8.0
Font Style: Regular

在 Java 中检索甘特图视图的进度线

进度线出现在甘特图视图中,显示任务是否落后或按时完成。我们可以按照下面给出的步骤读取进度线的各种属性:

  1. 首先,使用 Project 类加载项目文件。
  2. 接下来,通过索引从 ViewCollection 中获取默认视图。
  3. 然后,创建 GanttChartView 类和类型转换视图的实例。
  4. 之后,使用 getProgressLines() 获取甘特图视图的进度线列表。
  5. 最后,显示进度线属性值。

以下代码示例显示了如何在 Java 中读取甘特图视图的进度线。

public static void main(String[] args) throws Exception
{
    // 文档目录的路径。
    String dataDir = "C:\\Files\\Tasks\\";

    // 加载项目
    Project project = new Project(dataDir + "Project.mpp");

    // 获取默认视图为 GanttChartView
    GanttChartView gcView = (GanttChartView) project.getViews().toList().get(0);

    // 显示进度线信息
    System.out.println("ProgressLines.BeginAtDate: " + gcView.getProgressLines().getBeginAtDate().toString());
    System.out.println("ProgressLines.isBaselinePlan: " + gcView.getProgressLines().isBaselinePlan());
    System.out.println( "ProgressLines.DisplaySelected: " + gcView.getProgressLines().getDisplaySelected());
    System.out.println("ProgressLines.SelectedDates.Count: " + gcView.getProgressLines().getSelectedDates().size());

    System.out.println("ProgressLines.DisplayAtRecurringIntervals: " + gcView.getProgressLines().getDisplayAtRecurringIntervals());
    System.out.println("ProgressLines.RecurringInterval.Interval: " +  gcView.getProgressLines().getRecurringInterval().getInterval()  );
    System.out.println("ProgressLines.RecurringInterval.WeeklyDays.Count" +  gcView.getProgressLines().getRecurringInterval().getWeeklyDays().size());
    System.out.println("RecurringInterval.DayType.Friday: "  +  (int) gcView.getProgressLines().getRecurringInterval().getWeeklyDays().get(1));
    System.out.println("RecurringInterval.DayType.Saturday: "  + (int)gcView.getProgressLines().getRecurringInterval().getWeeklyDays().get(2));
    System.out.println("RecurringInterval.DayType.Sunday: " +  (int)gcView.getProgressLines().getRecurringInterval().getWeeklyDays().get(0));

    System.out.println("ProgressLines.ShowDate" + gcView.getProgressLines().getShowDate());

    System.out.println("ProgressLines.ProgressPointShape: " +  gcView.getProgressLines().getProgressPointShape());
    System.out.println("ProgressLines.ProgressPointColor: " +  gcView.getProgressLines().getProgressPointColor());
    System.out.println("ProgressLines.LineColor: " + gcView.getProgressLines().getLineColor());
    System.out.println("ProgressLines.LinePattern" +  gcView.getProgressLines().getLinePattern());

    System.out.println("ProgressLines.OtherProgressPointShape: " + gcView.getProgressLines().getOtherProgressPointShape());
    System.out.println("ProgressLines.OtherProgressPointColor: " + gcView.getProgressLines().getOtherProgressPointColor().toString());
    System.out.println("ProgressLines.OtherLineColor: " + gcView.getProgressLines().getOtherLineColor());
}

阅读 Java 中的底层时间刻度层

时间刻度显示时间单位、天、月、日历年或会计年度。项目视图中有三个 timescale tiers 来显示每个层的时间尺度值,例如计数、单位、标签、对齐方式等。我们可以按照以下给出的步骤读取底部的时间尺度层:

  1. 首先,使用 Project 类加载项目文件。
  2. 接下来,通过索引从 ViewCollection 中获取默认视图。
  3. 然后,创建 GanttChartView 类和类型转换视图的实例。
  4. 之后,使用 getBottomTimescaleTier() 获取视图底部时间刻度层的设置。
  5. 最后,显示底部时间刻度层值。

以下代码示例显示了如何在 Java 中读取甘特图视图的底部时间刻度层。

public static void main(String[] args) throws Exception
{
    // 文档目录的路径。
    String dataDir = "C:\\Files\\Tasks\\";

    // 加载项目
    Project project = new Project(dataDir + "Project.mpp");

    // 获取默认视图为 GanttChartView
    GanttChartView gcView = (GanttChartView) project.getViews().toList().get(0);

    // 显示底部时间刻度层信息
    System.out.println("BottomTimescaleTier Count: " + gcView.getBottomTimescaleTier().getCount());
    System.out.println("BottomTimescaleTier Unit: " + getTimescaleUnitName(gcView.getBottomTimescaleTier().getUnit()));
    System.out.println("BottomTimescaleTier UsesFiscalYear: " + gcView.getBottomTimescaleTier().getUsesFiscalYear());
    System.out.println("BottomTimescaleTier Alignment: " + getAlignmentName(gcView.getBottomTimescaleTier().getAlignment()));
    System.out.println("BottomTimescaleTier ShowTicks: " + gcView.getBottomTimescaleTier().getShowTicks());
    System.out.println("BottomTimescaleTier Label: " + getDateLabelName(gcView.getBottomTimescaleTier().getLabel()));
}

// 此函数返回时间刻度数据标签名称
private static String getDateLabelName(int val) throws IllegalArgumentException, IllegalAccessException {
  String name = null;
  java.lang.reflect.Field[] fields = DateLabel.class.getDeclaredFields();
 for (java.lang.reflect.Field f : fields) {
    int fVal = f.getInt(f);
      if( fVal == val)
      {
        name = f.getName();
      }
  }
  return name;
}

// 此函数返回对齐标题
private static String getAlignmentName(int val) throws IllegalArgumentException, IllegalAccessException {
  String name = null;
  java.lang.reflect.Field[] fields = StringAlignment.class.getDeclaredFields();
 for (java.lang.reflect.Field f : fields) {
    int fVal = f.getInt(f);
      if( fVal == val)
      {
        name = f.getName();
      }
  }
  return name;
}

// 此函数返回时间刻度单位名称
private static String getTimescaleUnitName(int val) throws IllegalArgumentException, IllegalAccessException {
  String name = null;
  java.lang.reflect.Field[] fields = TimescaleUnit.class.getDeclaredFields();
 for (java.lang.reflect.Field f : fields) {
    int fVal = f.getInt(f);
      if( fVal == val)
      {
        name = f.getName();
      }
  }
  return name;
}
BottomTimescaleTier Count: 2
BottomTimescaleTier Unit: Days
BottomTimescaleTier UsesFiscalYear: true
BottomTimescaleTier Alignment: Center
BottomTimescaleTier ShowTicks: true
BottomTimescaleTier Label: DayOfMonthDd

阅读 Java 中的中间时间尺度层

同样,我们可以按照前面提到的步骤读取中间时间尺度层。但是,我们将在步骤 4 中使用 getMiddleTimescaleTier() 获取视图的中间时间刻度层的设置。

以下代码示例显示了如何在 Java 中读取甘特图视图的中间时间刻度层。

public static void main(String[] args) throws Exception
{
    // 文档目录的路径。
    String dataDir = "C:\\Files\\Tasks\\";

    // 加载项目
    Project project = new Project(dataDir + "Project.mpp");

    // 获取默认视图为 GanttChartView
    GanttChartView gcView = (GanttChartView) project.getViews().toList().get(0);

    // 显示中间时间尺度层信息
    System.out.println("MiddleTimescaleTier Count: " + gcView.getMiddleTimescaleTier().getCount());
    System.out.println("TimescaleUnit Weeks: " +  getTimescaleUnitName(gcView.getMiddleTimescaleTier().getUnit()));
    System.out.println("MiddleTimescaleTier Alignment: " + getAlignmentName(gcView.getMiddleTimescaleTier().getAlignment()));
    System.out.println("MiddleTimescaleTier ShowTicks: " + gcView.getMiddleTimescaleTier().getShowTicks());
    System.out.println("MiddleTimescaleTier Label: " +  getDateLabelName(gcView.getMiddleTimescaleTier().getLabel()));
}
MiddleTimescaleTier.Count: 1
TimescaleUnit.Weeks: Months
MiddleTimescaleTier.Alignment: Center
MiddleTimescaleTier.ShowTicks: true
MiddleTimescaleTier.Label: MonthMmmmYyyy

检索 Java 中的顶级时间刻度层

我们还可以按照前面提到的步骤读取顶级时间尺度层。但是,我们将在第 4 步中使用 getTopTimescaleTier() 获取视图顶部时间刻度层的设置。

以下代码示例显示了如何在 Java 中读取甘特图视图的顶部时间刻度层。

public static void main(String[] args) throws Exception
{
    // 文档目录的路径。
    String dataDir = "C:\\Files\\Tasks\\";

    // 加载项目
    Project project = new Project(dataDir + "Project.mpp");

    // 获取默认视图为 GanttChartView
    GanttChartView gcView = (GanttChartView) project.getViews().toList().get(0);

    // 显示顶级时间刻度层信息
    System.out.println("TopTimescaleTier Unit: " + getTimescaleUnitName(gcView.getTopTimescaleTier().getUnit()));
    System.out.println("TopTimescaleTier UsesFiscalYear: " + gcView.getTopTimescaleTier().getUsesFiscalYear() );
    System.out.println("TopTimescaleTier Alignment: " +  getAlignmentName(gcView.getTopTimescaleTier().getAlignment()));
    System.out.println("TopTimescaleTier ShowTicks: " + gcView.getTopTimescaleTier().getShowTicks());
    System.out.println("TopTimescaleTier Label" + getDateLabelName(gcView.getTopTimescaleTier().getLabel()));
}
TopTimescaleTier Unit: Quarters
TopTimescaleTier UsesFiscalYear: true
TopTimescaleTier Alignment: Center
TopTimescaleTier ShowTicks: true
TopTimescaleTier Label: QuarterQtrQYyyy

获得免费许可证

您可以 获得免费的临时许可证 试用该库而不受评估限制。

结论

在本文中,我们学习了如何

  • 在 Java 中以编程方式阅读甘特图视图;
  • 提取甘特图视图的条形样式和文本样式;
  • 检索甘特图视图的网格线和进度线;
  • 使用 Java 读取甘特图视图的时间刻度单位。

此外,您可以使用 documentation 了解有关 Aspose.Tasks for Java API 的更多信息。如有任何歧义,请随时在 论坛 上与我们联系。

也可以看看