MS Project 是一款流行的項目管理軟件,廣泛用於高效地組織、管理和跟踪項目活動。它允許創建任務、添加資源、將任務分配給資源、監控進度以及管理與預算相關的活動。甘特圖視圖是項目的默認視圖。它列出了項目任務並顯示了它們之間的關係。它還使用甘特圖顯示項目的進度。在本文中,我們將學習如何使用Java讀取MS項目的甘特圖。
本文應涵蓋以下主題:
- Microsoft Project 中的甘特圖是什麼
- 讀取項目甘特圖的Java API
- 閱讀甘特圖視圖和檢索條形圖樣式
- 讀取甘特圖視圖的網格線
- 提取甘特圖視圖的文本樣式
- 檢索甘特圖視圖的進度線
- 讀取底部時間刻度層
- 讀取中間時間刻度層
- 檢索頂級時間刻度層
Microsoft Project 中的甘特圖是什麼
甘特圖是一種顯示項目進度的條形圖。它是項目任務隨時間變化的圖形表示,並提供了整個項目的鳥瞰圖。 Microsoft Project 中的甘特圖視圖顯示以下內容:
- 項目進度
- 時間估計
- 項目資源和團隊成員
- 任務優先級
- 任務依賴
讀取項目甘特圖的Java API
為了從 MPP 文件中讀取項目的甘特圖視圖,我們將使用 Aspose.Tasks for Java API。它允許在 Java 應用程序中以編程方式創建、編輯或操作 Microsoft Project 文件。 API 的 Project 類代表一個項目。它是公開各種方法以執行不同功能的主要類。它還允許讀取一種受支持的項目管理格式,例如 MPP、MPT、MPX 和 XML。 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 在甘特圖視圖中使用的條形樣式。我們可以按照下面給出的步驟閱讀甘特圖視圖並檢索條形圖樣式:
- 首先,使用 Project 類加載項目文件。
- 接下來,通過其索引從 ViewCollection 中獲取默認視圖。
- 然後,創建 GanttChartView 類和類型轉換視圖的實例。
- (可選)讀取基本屬性並顯示數據。
- 之後,使用 getBarStyles() 獲取甘特圖視圖的條形樣式列表。
- 最後,將條形樣式作為 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 類表示出現在甘特圖視圖中的網格線。我們可以按照下面給出的步驟讀取網格線的顏色、間隔、圖案和類型:
- 首先,使用 Project 類加載項目文件。
- 接下來,通過其索引從 ViewCollection 中獲取默認視圖。
- 然後,創建 GanttChartView 類和類型轉換視圖的實例。
- 之後,使用 getGridlines() 獲取甘特圖視圖的網格線列表。
- 最後,循環遍歷網格線作為 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 類表示甘特圖視圖中項目文本的視覺樣式。我們可以按照下面給出的步驟讀取顏色、背景顏色、字體和字體樣式:
- 首先,使用 Project 類加載項目文件。
- 接下來,通過其索引從 ViewCollection 中獲取默認視圖。
- 然後,創建 GanttChartView 類和類型轉換視圖的實例。
- 之後,使用 getTextStyles() 獲取甘特圖視圖的文本樣式列表。
- 最後,為第一個文本樣式和顯示值初始化 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 中檢索甘特圖視圖的進度線
進度線顯示在甘特圖視圖上,顯示任務是落後還是按時進行。我們可以按照以下步驟讀取進度線的各種屬性:
- 首先,使用 Project 類加載項目文件。
- 接下來,通過其索引從 ViewCollection 中獲取默認視圖。
- 然後,創建 GanttChartView 類和類型轉換視圖的實例。
- 之後,使用 getProgressLines() 獲取甘特圖視圖的進度線列表。
- 最後,顯示進度線屬性值。
以下代碼示例顯示瞭如何在 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 以顯示每個層的時間刻度值,如計數、單位、標籤、對齊等。我們可以按照以下步驟讀取底部時間刻度層:
- 首先,使用 Project 類加載項目文件。
- 接下來,通過其索引從 ViewCollection 中獲取默認視圖。
- 然後,創建 GanttChartView 類和類型轉換視圖的實例。
- 之後,使用 getBottomTimescaleTier() 獲取視圖底部時間刻度層的設置。
- 最後,顯示底部時間刻度層值。
以下代碼示例展示瞭如何在 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 的信息。如有任何歧義,請隨時在論壇上與我們聯繫。