# One-Click Report Generator (PPTX)

## PPTX 格式介紹

<figure><img src="https://2798179147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVirLUs8eTD53aDCy3tN3%2Fuploads%2FP0WEnO3E9ve5hqOmcM8w%2Fimage.png?alt=media&#x26;token=971c9808-23c6-4482-97b9-0d7e00c3525b" alt="" width="563"><figcaption><p>圖3-13</p></figcaption></figure>

PPTX 是 Microsoft PowerPoint (圖3-13)使用的一種檔案格式，它是一種基於 XML（eXtensible Markup Language）的標記語言。綜整來說 PPTX 格式有以下幾個特點：

1. <mark style="color:blue;">**檔案結構：**</mark> PPTX 檔案實際上是一個壓縮的ZIP檔案，其中包含了多個資料夾和檔案。這種結構使得檔案能夠更有效地儲存和處理。
2. <mark style="color:blue;">**XML格式：**</mark> PPTX 使用 XML 作為其主要標記語言。這意味著檔案中的內容以可讀的文本形式存在，而不是二進制格式，這有助於易於編輯和理解檔案的結構。
3. <mark style="color:blue;">**投影片內容：**</mark> PPTX 檔案包含了演示文稿的所有內容，如文字、圖片、圖表、影片和其他媒體。這些元素都被組織成一個或多個投影片，每個投影片可以包含多個物件。
4. <mark style="color:blue;">**樣式和格式：**</mark> PPTX 檔案還包含有關文本樣式、字型、顏色、版面配置等方面的信息。這些資訊確保了演示文稿的一致性和專業外觀。
5. <mark style="color:blue;">**儲存：**</mark> PPTX 檔案可以輕鬆地保存在本地裝置或雲端，方便與他人分享。同時，由於使用了XML，它也相對容易與其他應用程式進行整合。
6. <mark style="color:blue;">**編輯：**</mark> 除了專業的 PPT 編輯軟體，由於檔案的結構和使用 XML，你也可以使用文本編輯器或來修改 PPTX 檔案。

{% hint style="info" %}
PPT 是舊版 Office PowerPoint 使用的二進制檔案格式。它不同於 PPTX 的 XML 結構，而是以二進制形式存儲演示文稿內容。PPT 檔案也通常較大也無法用文本編輯器修改。

總的來說，PPTX 是一種更現代、更靈活、更容易處理的格式，而 PPT 則是舊世代格式，可能在一些方面不如 PPTX 靈活和高效。製作 Powerpoint 時，建議盡量使用 PPTX 格式，以確保最佳的相容性和功能。
{% endhint %}

在日常的工作中，因為 PPTX 是一個靈活且廣泛使用的演示文稿格式，適用於創建具有多媒體內容的專業演示文稿。所以各種工作人員都以 PowerPoint 是主要報告的工具，很多人也會以此來做為報告的整理格式。

以筆者的習慣來說，在設計前期整理日常工作時，HTML 格式非常適合紀錄使用；但在確定最終設計後，生成 PPTX 格式的報告，以便能夠直接在會議中進行口頭報告。恰巧，我們可以利用兩種方式來區分設計中版本(HTML)和最終確認版本(PPTX)。

基於前面章節的基礎，在這篇文章中，筆者將介紹<mark style="color:blue;">「One-Click PPTX Report Generator」</mark>的開發，讓 AEDT 自動產生 PowerPoint 模擬報告。

在 CPython 中有 <mark style="background-color:yellow;">Python-PPTX</mark> 這個方便的模組來產生 PPTX 報告(有興趣的讀者可以參考[前面PyAEDT章節](https://eemans-organization.gitbook.io/maxwell-automation/pyaedt/automatically-generate-reports))，實際上在 IronPython 中，我們有類似的模組可以使用。利用 IronPython 內建的 <mark style="background-color:red;">clr 模組</mark>，來加載 "<mark style="background-color:blue;">`Microsoft.Office.Interop.PowerPoint`</mark>" 這個類似於 C# 模組組件，就能來自動製作 PPTX 投影片。然而，與 Python-PPTX 模組提供的豐富說明資源不同，使用這個模組可能會面臨兩個困難：一是模組的語法不像 CPython 那樣簡潔易於理解；二是相關的網路說明資源並不容易找到，撰寫不易。

{% hint style="info" %}
`clr`模組，它是一個IronPython內建的模組，用於訪問.NET組件。

例如: `clr.AddReference("Microsoft.Office.Interop.PowerPoint")`: 這一行代碼是使用`clr`模組，它是一個 Python 內建的模組，用於訪問 .NET 組件。這裡，它通知IronPython要加載`Microsoft.Office.Interop.PowerPoint`組件，這是與 PowerPoint 互動的 .NET 組件。
{% endhint %}

以下筆者盡自己的淺薄經驗和讀者分享使用方式。

## IronPython PowerPoint 模組

在 IronPython 中，"<mark style="background-color:blue;">`Microsoft.Office.Interop.PowerPoint`</mark>" 模組是一組用於與 PowerPoint 應用程式進行交互的介面和類別的集合。這允許開發者使用 IronPython 腳本來自動化和控制 Microsoft PowerPoint 應用程式，以建立、修改和管理 PowerPoint 演示文稿。

* <mark style="background-color:green;">**ApplicationClass**</mark><mark style="background-color:green;">:</mark> 代表 PowerPoint 應用程式的頂層對象。通過創建 `ApplicationClass` 實例，你可以打開、關閉、建立演示文稿等。

```python
// ApplicationClass Code
# Create PPTX
clr.AddReference("Microsoft.Office.Interop.PowerPoint")
import Microsoft.Office.Interop.PowerPoint as PowerPoint
from Microsoft.Office.Interop.PowerPoint import Application, PpSaveAsFileType
powerpoint = PowerPoint.ApplicationClass()
```

* <mark style="background-color:green;">**Presentation**</mark><mark style="background-color:green;">:</mark> 表示 PowerPoint 演示文稿的類別。你可以通過 `ApplicationClass` 創建新的演示文稿，然後通過該類別來操作演示文稿的屬性和方法。或是打開現有的範本來做套用。

```python
// Presentation Code
try: 
    ppt = powerpoint.Presentations.Open("D:\\Ansys_Report_template.pptx")
except:    
    ppt=powerpoint.Presentations.Add()
```

* <mark style="background-color:green;">**Slide**</mark><mark style="background-color:green;">:</mark> 代表 PowerPoint 中的一張幻燈片。你可以通過 `Slides` 屬性獲取演示文稿中的幻燈片集合，並對每張幻燈片進行操作。

```python
// Slide code
# Page 1 (Cover)
cover_slide = ppt.Slides.Add(1, 1)  #第一個參數是投影片的索引，第二個參數是投影片的類型（1表示空白投影片）
custom_layout = ppt.Designs(2).SlideMaster.CustomLayouts(1)  # 第一個參數是母片的索引，第二個參數是自訂佈局的索引
cover_slide.CustomLayout = custom_layout

title_shape = cover_slide.Shapes.Title
title_shape.TextFrame.TextRange.Text = "Maxwell Auto-Report"
title_shape.TextFrame.TextRange.Font.Bold = True
title_shape.TextFrame.TextRange.Font.Size = 52
```

* <mark style="background-color:green;">**Shapes**</mark><mark style="background-color:green;">:</mark> 表示 PowerPoint 中的形狀物件。可以通過 `Shapes` 屬性來獲取幻燈片中的形狀集合，並對形狀進行操作。

```
// Shapes code
title_shape = slide.Shapes.Title
```

* <mark style="background-color:green;">**Table**</mark><mark style="background-color:green;">:</mark> 代表 PowerPoint 中的表格物件。你可以使用 `AddTable` 方法在幻燈片中添加表格，並對表格進行操作。

```python
// Table code
# 添加一個表格
table = slide.Shapes.AddTable(3, 2, 80, 120, 800, 100).Table

# 獲取表格中的第一個單元格
cell = table.Cell(1, 1)

# 設定文字內容
cell.Shape.TextFrame.TextRange.Text = "Project_variable"

# 合併第一行的兩列
table.Cell(1, 2).Merge(table.Cell(1, 1))

# 將合併後的單元格內容置中
merged_cell = table.Cell(1, 1)
merged_cell.Shape.TextFrame.TextRange.ParagraphFormat.Alignment = PowerPoint.PpParagraphAlignment.ppAlignCenter

# 設定合併後的單元格字型大小、顏色和字型
merged_cell.Shape.TextFrame.TextRange.Font.Size = 18  # 字型大小
merged_cell.Shape.TextFrame.TextRange.Font.Color.RGB = 255  # 字型顏色 (紅色)
merged_cell.Shape.TextFrame.TextRange.Font.Name = "Arial"  # 字型名稱

design_variable = ["Gap","Height"]
# 設定非合併的單元格字型大小、顏色和字型
for col in range(2):
    cell = table.Cell(2, col + 1) # 表格的index是從1開始的
    cell.Shape.TextFrame.TextRange.Text = design_variable[col]
    cell.Shape.TextFrame.TextRange.Font.Size = 14  # 字型大小
    cell.Shape.TextFrame.TextRange.Font.Color.RGB = 0  # 字型顏色 (黑色)
    cell.Shape.TextFrame.TextRange.Font.Name = "Times New Roman"  # 字型名稱

# 保存演示文稿
presentation.SaveAs("C:\\Path\\To\\Your\\Presentation.pptx")

# 關閉 PowerPoint 應用程式
powerpoint.Quit()
```

改寫前面的程式碼並加入 PPTX 的生成功能後，程式碼的撰寫就接近完成。相比於 HTML 版本，PPTX 的編成工作不需要全部自定義內容，且因為有了模組的幫忙，可以減少許多編寫程式碼的工作時間。

## Maxwell One-Click PPTX Report Generator

完成程式碼後，我們依著前面章節的步驟，創建了一個<mark style="color:blue;">「One-Click PPTX Reporter」</mark>的圖示，再利用 customerize tool 將 Script 與圖示放入 AEDT Maxwell 的工具列當中。

<figure><img src="https://2798179147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVirLUs8eTD53aDCy3tN3%2Fuploads%2FKaxtG3vWhq3adTmLw9sz%2Fimage.png?alt=media&#x26;token=a84a779a-60de-4720-8f01-0407558d63a1" alt=""><figcaption><p>圖3-14</p></figcaption></figure>

置入完成後，可以在 AEDT 的執行畫面中看到，已經新增的 OC\_PPTX 按鍵出現在 Automation 的功能頁面中，如圖3-15。直接點選按鍵，就能執行一鍵生成報告。

<figure><img src="https://2798179147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVirLUs8eTD53aDCy3tN3%2Fuploads%2FE2cODNJyLwG9J0pfPIbM%2Fimage.png?alt=media&#x26;token=f47cc5a7-de29-4b98-b061-f7ab3ceb5968" alt=""><figcaption><p>圖3-15</p></figcaption></figure>

下面筆者以一個同步發電機案例來作為本節的功能演示。

## 同步發電機（Synchronous Generator）

同步發電機作為一種關鍵的<mark style="color:red;">電力轉換裝置</mark>，用於將機械能轉換為電能，在多個領域中有廣泛的應用。其原理基於磁場的旋轉，使其成為發電廠、風力發電系統、柴油發電機組等的主要元件。同時，融合 Ansys Maxwell 的模擬技術，我們可以更深入地設計和優化同步發電機，以確保其性能和效率。

**應用方面：**

在發電廠中，同步發電機與蒸汽或水力渦輪機結合，形成發電機組，提供穩定的電力輸出。同步發電機也被廣泛應用於風力發電系統，將風車轉動能量轉換為電能。在柴油發電機組中，同步發電機是核心元件，應對應急發電和區域電力缺乏的情況。

**馬達設計要點：**

同步發電機的馬達設計考慮多個關鍵因素。首先，<mark style="color:blue;">定子和轉子的設計</mark>需要嚴謹，包括<mark style="background-color:red;">適當的鐵芯選擇、繞組設計以及轉子極數的配置</mark>。在 Ansys Maxwell 的模擬中，進行電磁場分析，確保磁場分佈均勻，繞組設計合理，以提高效能。

此外，考慮冷卻系統的效果是不可或缺的，Ansys Maxwell 的熱損耗分析可以結合 Icepak 模擬冷卻系統的性能，確保發電機在長時間運轉中保持適當的溫度。機械結構分析則涵蓋了振動和應力分析，以及機械部件之間的耦合效應，保證發電機在高速運轉時的穩定性。

最後，效能優化是設計過程中的重要一環。透過 Ansys Maxwell 模擬分析繞組中的損耗，並優化設計，以提高能量轉換效率，確保同步發電機在各種應用中都能發揮最佳性能。同步發電機的應用廣泛，設計考慮多方面因素，結合 Ansys Maxwell 的模擬技術，能夠更精確地設計和優化同步發電機，以應對不同的應用場景，確保其可靠運行和高效能轉換。

在進行模擬完後，我們可以用<mark style="color:blue;">「One-Click PPTX Report Generator」</mark>來產生模擬報告。如圖3-16的動畫所示。執行按鍵後，選擇並確認欲放置的資料夾，接著 AEDT 的 Message 視窗會跳出目前轉檔的情況，完成後報告會自動生成 PPTX 格式放在資料夾中。

<figure><img src="https://2798179147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVirLUs8eTD53aDCy3tN3%2Fuploads%2FEmi3zNffCOR3kBUZSjQC%2FOC_PPTX.gif?alt=media&#x26;token=336c7553-bba4-43f1-b2e1-d5d14c6562f1" alt=""><figcaption><p>圖3-16</p></figcaption></figure>

因為也是基於本章同樣的程式碼架構做開發，生成的報告如同前面的 HTML 版本，包含了以下幾個部分：

* [x] <mark style="color:red;">**檔案封面與標題：**</mark>設計 Project 與設計者名稱。
* [x] <mark style="color:red;">**設計資訊：**</mark>電腦名稱、模擬版本資訊、報告產出時間、使用電腦、設計者。
* [x] <mark style="color:red;">**設計記事本：**</mark>會將 AEDT 的記事本內容複製到報告中。
* [x] <mark style="color:red;">**設計參數。**</mark>
* [x] <mark style="color:red;">**設計材料。**</mark>
* [x] <mark style="color:red;">**設計圖片。**</mark>
  * [x] <mark style="color:red;">**Model 圖片**</mark><mark style="color:red;">。</mark>
  * [x] <mark style="color:red;">**設計報告：**</mark>設計的模擬各式報表圖片。
  * [x] <mark style="color:red;">**Mesh與電磁場分布：**</mark>設計案例的 Mesh 與電磁場分佈繪圖。

最後生成的報告如圖3-17\~19所示。

<figure><img src="https://2798179147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVirLUs8eTD53aDCy3tN3%2Fuploads%2FCs11ixxp4yjpqBu1MlMj%2Fimage.png?alt=media&#x26;token=c9a38460-88ec-460c-afed-644c252e383b" alt=""><figcaption><p>圖3-17</p></figcaption></figure>

<figure><img src="https://2798179147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVirLUs8eTD53aDCy3tN3%2Fuploads%2FivVZx8GGObDTCZxfV4WT%2Fimage.png?alt=media&#x26;token=54cb5294-f095-4e9f-b1a4-3d051d63833a" alt=""><figcaption><p>圖3-18</p></figcaption></figure>

<figure><img src="https://2798179147-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FVirLUs8eTD53aDCy3tN3%2Fuploads%2FqJ8K9MwaWJs2c3PCMFma%2Fimage.png?alt=media&#x26;token=7e2da38f-ff13-491d-8830-23d98a419fc9" alt=""><figcaption><p>圖3-19</p></figcaption></figure>

此次的開發，可重複使用，同樣能安裝在 <mark style="background-color:orange;">AEDT 各軟件 (例如：HFSS、Q3D、Icepak、Maxwell3D、Maxwell2D) 中使用。</mark>

對於筆者來說，用過 HTML 與 PPTX 這兩種報告格式，兩者各有其適合應用的地方，HTML 好處是一頁式報告，找尋資料與歸檔方便，檔案亦較小容易開啟與保存；PPTX 的格式能快速調整格式、適用於公司資料分享，並能直接做口頭報告使用。

{% hint style="info" %}
本節介紹的生成式報告 PPTX，能套用現有的 PowerPoint 報告格式。也就是說，如果已經有既定的 PPTX 母片檔案，生成的報告能遵循其格式做套用，快速調整成自我風格的投影片。
{% endhint %}
