在 Android 上管理簡報中的 SmartArt 形狀節點

概觀

PowerPoint 簡報中的 SmartArt 圖形透過包含文字的節點來組織,並定義圖表的結構。Aspose.Slides 允許您以程式方式操作這些 SmartArt 節點:新增節點與子節點、在特定位置插入子節點、存取現有節點,以及讀取它們的文字、層級與位置。

本文件說明如何管理 SmartArt 形狀節點。它展示了如何移除節點、依索引或位置處理子節點、將助理節點變更為普通節點、調整 SmartArt 節點形狀的位置、大小與旋轉、設定節點的填充格式,以及為 SmartArt 子節點產生縮圖。

新增 SmartArt 節點

Aspose.Slides for Android via Java 提供了最簡易的 API,以最簡單的方式管理 SmartArt 形狀。以下範例程式碼說明如何在 SmartArt 形狀中新增節點與子節點。

  1. 建立 Presentation 類別的執行個體,並載入含有 SmartArt 形狀的簡報。
  2. 使用索引取得第一張投影片的參照。
  3. 遍歷第一張投影片內的所有形狀。
  4. 檢查形狀是否為 SmartArt 型別,如果是,則將選取的形狀型別轉換為 SmartArt
  5. 在 SmartArt 形狀的 NodeCollection新增節點,並在 TextFrame 中設定文字。
  6. 現在,在新加入的 SmartArt 節點中 新增 一個 Child Node,並在 TextFrame 中設定文字。
  7. 儲存簡報。
// 載入所需的簡報
Presentation pres = new Presentation("SimpleSmartArt.pptx");
try {
    // 遍歷第一張投影片內的所有形狀
    for (IShape shape : pres.getSlides().get_Item(0).getShapes()) 
    {
        // 檢查形狀是否為 SmartArt 類型
        if (shape instanceof SmartArt) 
        {
            // 將形狀型別轉換為 SmartArt
            SmartArt smart = (SmartArt) shape;
    
            // 新增一個 SmartArt 節點
            SmartArtNode TemNode = (SmartArtNode) smart.getAllNodes().addNode();
    
            // 新增文字
            TemNode.getTextFrame().setText("Test");
    
            // 在父節點中新增子節點。它將被加入至集合的末端
            SmartArtNode newNode = (SmartArtNode) TemNode.getChildNodes().addNode();
    
            // 新增文字
            newNode.getTextFrame().setText("New Node Added");
        }
    }
    
    // 儲存簡報
    pres.save("AddSmartArtNode.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

在特定位置新增 SmartArt 節點

以下範例程式碼說明如何在特定位置為 SmartArt 形狀的相應節點新增子節點。

  1. 建立 Presentation 類別的執行個體。
  2. 使用索引取得第一張投影片的參照。
  3. 在取得的投影片中新增一個 StackedList 類型的 SmartArt 形狀。
  4. 存取新增的 SmartArt 形狀中的第一個節點。
  5. 現在,於位置 2 為選取的 Node 新增 Child Node,並設定其文字。
  6. 儲存簡報
// 建立簡報實例
Presentation pres = new Presentation();
try {
    // 存取簡報投影片
    ISlide slide = pres.getSlides().get_Item(0);

    // 新增 Smart Art IShape
    ISmartArt smart = slide.getShapes().addSmartArt(0, 0, 400, 400, SmartArtLayoutType.StackedList);

    // 取得索引為 0 的 SmartArt 節點
    ISmartArtNode node = smart.getAllNodes().get_Item(0);

    // 在父節點的第 2 個位置新增子節點
    SmartArtNode chNode = (SmartArtNode) ((SmartArtNodeCollection) node.getChildNodes()).addNodeByPosition(2);

    // 新增文字
    chNode.getTextFrame().setText("Sample Text Added");

    // 儲存簡報
    pres.save("AddSmartArtNodeByPosition.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

存取 SmartArt 節點

以下範例程式碼說明如何存取 SmartArt 形狀內的節點。請注意,SmartArt 的 LayoutType 為唯讀,僅在加入 SmartArt 形狀時設定,無法更改。

  1. 建立 Presentation 類別的執行個體,並載入含有 SmartArt 形狀的簡報。
  2. 使用索引取得第一張投影片的參照。
  3. 遍歷第一張投影片內的所有形狀。
  4. 檢查形狀是否為 SmartArt 型別,如果是,則將選取的形狀型別轉換為 SmartArt
  5. 遍歷 SmartArt 形狀內的所有 Nodes
  6. 存取並顯示 SmartArt 節點的位置、層級及文字等資訊。
// 實例化 Presentation 類別
Presentation pres = new Presentation("SmartArtShape.pptx");
try {
    // 取得第一張投影片
    ISlide slide = pres.getSlides().get_Item(0);
    
    // 遍歷第一張投影片內的每個形狀
    for (IShape shape : slide.getShapes()) 
    {
        // 檢查形狀是否為 SmartArt 類型
        if (shape instanceof ISmartArt) 
        {
            // 將形狀型別轉換為 SmartArt
            ISmartArt smart = (ISmartArt) shape;
    
            // 遍歷 SmartArt 內的所有節點
            for (int i = 0; i < smart.getAllNodes().size(); i++) 
            {
                // 取得索引 i 的 SmartArt 節點
                SmartArtNode node = (SmartArtNode) smart.getAllNodes().get_Item(i);
    
                // 列印 SmartArt 節點參數
                System.out.print(node.getTextFrame().getText() + " " + node.getLevel() + " " + node.getPosition());
            }
        }
    }
} finally {
    if (pres != null) pres.dispose();
}

存取 SmartArt 子節點

以下範例程式碼說明如何存取 SmartArt 形狀中各節點所屬的子節點。

  1. 建立 Presentation 類別的執行個體,並載入含有 SmartArt 形狀的簡報。
  2. 使用索引取得第一張投影片的參照。
  3. 遍歷第一張投影片內的所有形狀。
  4. 檢查形狀是否為 SmartArt 型別,如果是,則將選取的形狀型別轉換為 SmartArt
  5. 遍歷 SmartArt 形狀內的所有 Nodes
  6. 對每個選取的 SmartArt 形狀 Node,遍歷該節點內的所有 Child Nodes
  7. 存取並顯示 Child Node 的位置、層級與文字等資訊。
// 實例化 Presentation 類別
Presentation pres = new Presentation("AccessChildNodes.pptx");
try {
    // 取得第一張投影片
    ISlide slide = pres.getSlides().get_Item(0);
    
    // 遍歷第一張投影片內的每個形狀
    for (IShape shape : slide.getShapes()) 
    {
        // 檢查形狀是否為 SmartArt 類型
        if (shape instanceof ISmartArt) 
        {
            // 將形狀型別轉換為 SmartArt
            ISmartArt smart = (ISmartArt) shape;
    
            // 遍歷 SmartArt 內的所有節點
            for (int i = 0; i < smart.getAllNodes().size(); i++) 
            {
                // 取得索引 i 的 SmartArt 節點
                SmartArtNode node0 = (SmartArtNode) smart.getAllNodes().get_Item(i);
                
                // 遍歷索引 i 的 SmartArt 節點中的子節點
                for (int j = 0; j < node0.getChildNodes().size(); j++) 
                {
                    // 取得 SmartArt 節點中的子節點
                    SmartArtNode node = (SmartArtNode) node0.getChildNodes().get_Item(j);
    
                    // 列印 SmartArt 子節點參數
                    System.out.print("j = " + j + ", Text = " + node.getTextFrame().getText() + ",  Level = " + node.getLevel() + ", Position = " + node.getPosition());
                }
            }
        }
    }
} finally {
    if (pres != null) pres.dispose();
}

在特定位置存取 SmartArt 子節點

本範例說明如何在特定位置存取 SmartArt 形狀中各節點的子節點。

  1. 建立 Presentation 類別的執行個體。
  2. 使用索引取得第一張投影片的參照。
  3. 新增一個 StackedList 類型的 SmartArt 形狀。
  4. 存取剛新增的 SmartArt 形狀。
  5. 取得該 SmartArt 形狀中索引為 0 的節點。
  6. 現在,使用 get_Item() 方法存取該 SmartArt 節點中位置為 1 的 Child Node
  7. 存取並顯示 Child Node 的位置、層級與文字等資訊。
// 建立簡報實例
Presentation pres = new Presentation();
try {
    // 存取第一張投影片
    ISlide slide = pres.getSlides().get_Item(0);
    
    // 在第一張投影片中新增 SmartArt 形狀
    ISmartArt smart = slide.getShapes().addSmartArt(0, 0, 400, 400, SmartArtLayoutType.StackedList);
    
    // 取得索引為 0 的 SmartArt 節點
    ISmartArtNode node = smart.getAllNodes().get_Item(0);
    
    // 取得父節點中位置 1 的子節點
    int position = 1;
    SmartArtNode chNode = (SmartArtNode) ((SmartArtNodeCollection) node.getChildNodes()).get_Item(position);
    
    // 列印 SmartArt 子節點參數
    System.out.print("Text = " + chNode.getTextFrame().getText() + ",  Level = " + chNode.getLevel() + ", Position = " + chNode.getPosition());
} finally {
    if (pres != null) pres.dispose();
}

移除 SmartArt 節點

本範例說明如何移除 SmartArt 形狀中的節點。

  1. 建立 Presentation 類別的執行個體,並載入含有 SmartArt 形狀的簡報。
  2. 使用索引取得第一張投影片的參照。
  3. 遍歷第一張投影片內的所有形狀。
  4. 檢查形狀是否為 SmartArt 型別,如果是,則將選取的形狀型別轉換為 SmartArt
  5. 檢查該 SmartArt 是否包含超過 0 個節點。
  6. 選取要刪除的 SmartArt 節點。
  7. 現在,使用 RemoveNode 方法移除選取的節點。
  8. 儲存簡報。
// 載入所需的簡報
Presentation pres = new Presentation("AddSmartArtNode.pptx");
try {
    // 遍歷第一張投影片內的所有形狀
    for (IShape shape : pres.getSlides().get_Item(0).getShapes()) 
    {
        // 檢查形狀是否為 SmartArt 類型
        if (shape instanceof ISmartArt) 
        {
            // 將形狀型別轉換為 SmartArt
            ISmartArt smart = (ISmartArt) shape;
    
            if (smart.getAllNodes().size() > 0) 
            {
                // 取得索引為 0 的 SmartArt 節點
                ISmartArtNode node = smart.getAllNodes().get_Item(0);
    
                // 移除選取的節點
                smart.getAllNodes().removeNode(node);
            }
        }
    }
    
    // 儲存簡報
    pres.save("RemoveSmartArtNode.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

從特定位置移除 SmartArt 節點

本範例說明如何在特定位置移除 SmartArt 形狀中的節點。

  1. 建立 Presentation 類別的執行個體,並載入含有 SmartArt 形狀的簡報。
  2. 使用索引取得第一張投影片的參照。
  3. 遍歷第一張投影片內的所有形狀。
  4. 檢查形狀是否為 SmartArt 型別,如果是,則將選取的形狀型別轉換為 SmartArt
  5. 選取索引為 0 的 SmartArt 形狀節點。
  6. 現在,檢查選取的 SmartArt 節點是否有超過 2 個子節點。
  7. 現在,使用 RemoveNode 方法移除 Position 1 的節點。
  8. 儲存簡報。
// 載入所需的簡報
Presentation pres = new Presentation("AddSmartArtNode.pptx");
try {
    // 遍歷第一張投影片內的所有形狀
    for (IShape shape : pres.getSlides().get_Item(0).getShapes()) 
    {
        // 檢查形狀是否為 SmartArt 類型
        if (shape instanceof SmartArt) 
        {
            // 將形狀型別轉換為 SmartArt
            SmartArt smart = (SmartArt) shape;
    
            if (smart.getAllNodes().size() > 0) 
            {
                // 取得索引為 0 的 SmartArt 節點
                ISmartArtNode node = smart.getAllNodes().get_Item(0);
    
                if (node.getChildNodes().size() >= 2) 
                {
                    // 移除位置 1 的子節點
                    (node.getChildNodes()).removeNode(1);
                }
            }
        }
    }
    
    // 儲存簡報
    pres.save("RemoveSmartArtNodeByPosition.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

為 SmartArt 物件的子節點設定自訂位置

現在 Aspose.Slides for Android via Java 支援設定 SmartArtShapeXY 屬性。以下程式碼片段示範如何設定自訂的 SmartArtShape 位置、大小與旋轉,另請注意,新增節點會重新計算所有節點的位置與大小。透過自訂位置設定,使用者可依需求調整節點。

// 實例化 Presentation 類別
Presentation pres = new Presentation("SimpleSmartArt.pptx");
try{
    ISmartArt smart = pres.getSlides().get_Item(0).getShapes().addSmartArt(20, 20, 600, 500, SmartArtLayoutType.OrganizationChart);

    // 將 SmartArt 形狀移動至新位置
    ISmartArtNode node = smart.getAllNodes().get_Item(1);
    ISmartArtShape shape = node.getShapes().get_Item(1);
    shape.setX(shape.getX() + shape.getWidth() * 2);
    shape.setY(shape.getY() - shape.getHeight() * 2);

    // 更改 SmartArt 形狀的寬度
    node = smart.getAllNodes().get_Item(2);
    shape = node.getShapes().get_Item(1);
    shape.setWidth(shape.getWidth() + shape.getWidth() * 2);

    // 更改 SmartArt 形狀的高度
    node = smart.getAllNodes().get_Item(3);
    shape = node.getShapes().get_Item(1);
    shape.setHeight(shape.getHeight() + shape.getHeight() * 2);

    // 更改 SmartArt 形狀的旋轉角度
    node = smart.getAllNodes().get_Item(4);
    shape = node.getShapes().get_Item(1);
    shape.setRotation(90);

    pres.save("SmartArt.pptx", SaveFormat.Pptx);
}finally {
    pres.dispose();
}

檢查助理節點

我們將在本篇文章的不同章節中使用以下來源 SmartArt 形狀進行測試。

todo:image_alt_text
圖示:投影片中的來源 SmartArt 形狀

以下範例程式碼說明如何在 SmartArt 節點集合中辨識 Assistant Nodes,並對其進行變更。

  1. 建立 Presentation 類別的執行個體,並載入含有 SmartArt 形狀的簡報。
  2. 使用索引取得第二張投影片的參照。
  3. 遍歷第一張投影片內的所有形狀。
  4. 檢查形狀是否為 SmartArt 型別,如果是,則將選取的形狀型別轉換為 SmartArt
  5. 遍歷 SmartArt 形狀內的所有節點,並檢查它們是否為 Assistant Nodes
  6. 將 Assistant Node 的狀態變更為普通節點。
  7. 儲存簡報。
// 建立簡報實例
Presentation pres = new Presentation("AddNodes.pptx");
try {
    // 遍曆第一張投影片內的所有形狀
    for (IShape shape : pres.getSlides().get_Item(0).getShapes()) 
    {
        // 檢查形狀是否為 SmartArt 類型
        if (shape instanceof ISmartArt) 
        {
            // 將形狀型別轉換為 SmartArt
            ISmartArt smart = (SmartArt) shape;
    
            // 遍曆 SmartArt 形狀的所有節點
            for (int i = 0; i < smart.getAllNodes().size(); i++) 
            {
                ISmartArtNode node = smart.getAllNodes().get_Item(i);
                // 檢查節點是否為助理節點
                if (node.isAssistant()) 
                {
                    // 將助理節點設為 false 並轉為普通節點
                    node.isAssistant();
                }
            }
        }
    }
    
    // 儲存簡報
    pres.save("ChangeAssitantNode.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}
todo:image_alt_text
圖示:投影片中 SmartArt 形狀的助理節點已變更

設定節點的填充格式

Aspose.Slides for Android via Java 可讓您新增自訂 SmartArt 形狀並設定其填充格式。本文件說明如何建立與存取 SmartArt 形狀,以及使用 Aspose.Slides for Android via Java 設定其填充格式。

請依照以下步驟操作:

  1. 建立 Presentation 類別的執行個體。
  2. 使用索引取得投影片的參照。
  3. 設定其 LayoutType 以新增一個 SmartArt 形狀。
  4. 為 SmartArt 形狀的節點設定 FillFormat
  5. 將修改後的簡報寫入為 PPTX 檔案。
// 建立簡報實例
Presentation pres = new Presentation();
try {
    // 取得投影片
    ISlide slide = pres.getSlides().get_Item(0);
    
    // 新增 SmartArt 形狀與節點
    ISmartArt chevron = slide.getShapes().addSmartArt(10, 10, 800, 60, SmartArtLayoutType.ClosedChevronProcess);
    ISmartArtNode node = chevron.getAllNodes().addNode();
    node.getTextFrame().setText("Some text");
    
    // 設定節點填充顏色
    for (IShape item : node.getShapes()) 
    {
        item.getFillFormat().setFillType(FillType.Solid);
        item.getFillFormat().getSolidFillColor().setColor(Color.RED);
    }
    
    // 儲存簡報
    pres.save("TestSmart.pptx", SaveFormat.Pptx);
} finally {
    if (pres != null) pres.dispose();
}

產生 SmartArt 子節點的縮圖

開發人員可依照以下步驟產生 SmartArt 子節點的縮圖:

  1. 建立 Presentation 類別的執行個體。
  2. 新增 SmartArt
  3. 使用索引取得節點的參照。
  4. 取得縮圖影像。
  5. 將縮圖以任意影像格式儲存。
// 建立代表 PPTX 檔案的 Presentation 類別實例
Presentation pres = new Presentation();
try {
    // 新增 SmartArt 
    ISmartArt smart = pres.getSlides().get_Item(0).getShapes().addSmartArt(10, 10, 400, 300, SmartArtLayoutType.BasicCycle);

    // 透過索引取得節點的參考  
    ISmartArtNode node = smart.getNodes().get_Item(1);

    // 取得縮圖
    IImage slideImage = node.getShapes().get_Item(0).getImage();

    // 儲存縮圖
    try {
          slideImage.save("SmartArt_ChildNote_Thumbnail.png", ImageFormat.Png);
    } finally {
         if (slideImage != null) slideImage.dispose();
    }
} finally {
    if (pres != null) pres.dispose();
}

FAQ

是否支援 SmartArt 動畫?

是。SmartArt 被視為一般形狀,您可以 套用標準動畫(進入、退出、強調、移動路徑)並調整時間。必要時,也可對 SmartArt 節點內的形狀套用動畫。

如果不知道內部 ID,如何可靠地在投影片上定位特定 SmartArt?

透過指派與搜尋 alternative text 來定位。為 SmartArt 設定唯一的 AltText,就能在程式中找出它,而不必依賴內部識別碼。

將簡報轉換為 PDF 時,SmartArt 的外觀會被保留嗎?

會。Aspose.Slides 在 PDF 匯出 時以高視覺保真度呈現 SmartArt,保留佈局、顏色與效果。

我可以擷取整個 SmartArt 的影像(用於預覽或報告)嗎?

可以。您可以將 SmartArt 形狀轉為 raster formatsSVG 以取得可縮放的向量輸出,適用於縮圖、報告或網站使用。