使用Java閱讀項目甘特圖

MS Project 是一款流行的項目管理軟件,廣泛用於高效地組織、管理和跟踪項目活動。它允許創建任務、添加資源、將任務分配給資源、監控進度以及管理與預算相關的活動。甘特圖視圖是項目的默認視圖。它列出了項目任務並顯示了它們之間的關係。它還使用甘特圖顯示項目的進度。在本文中,我們將學習如何使用Java讀取MS項目的甘特圖。

本文應涵蓋以下主題:

Microsoft Project 中的甘特圖是什麼

甘特圖是一種顯示項目進度的條形圖。它是項目任務隨時間變化的圖形表示,並提供了整個項目的鳥瞰圖。 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 讀取甘特圖視圖的時間刻度單位。

此外,您可以使用文檔了解更多關於 Aspose.Tasks for Java API 的信息。如有任何歧義,請隨時在論壇上與我們聯繫。

也可以看看