python-pptxでテストデータ作成

# イントロ
2つ目の記事になります、QAエンジニアのヨシナです。

ソフトウェアテスト用に4000スライドを持つPowerPoint(pptx)ファイルを作成する必要がありました。しかし、この膨大な作業を手作業で行うのは非現実的です。そこでChatGPTに「pptxファイルを作成するツールがないか」を尋ねたところ、python-pptxというPythonのライブラリを紹介されました。調べてみると、[こちら](https://qiita.com/kousakulog/items/34855cd8286bd4f33c08)のような記事が出てきて、python-pptxはPythonでのパワーポイント作成によく使用されているようでした。

本記事では、python-pptxでどのようにテスト用のpptxファイルを作成したかを説明します。

# python-pptxとは？

**python-pptx** はpptxファイルを**作成**、**読み込み**、**更新**するPythonライブラリです。英語で書かれていますが、公式ドキュメントは[こちら](https://python-pptx.readthedocs.io/en/latest/index.html#) です。2013年にプレリリースされたライブラリで、2024年8月に新しいバージョンをリリースしています。

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3996946/54a681ed-eed8-499f-b719-d379353ab2e7.png)
 python-pptxの[リリース履歴](https://pypi.org/project/python-pptx/#history)

# スライドの作り方

スライドを作るのはとても簡単です。以下のサンプルコード通りにPresentationオブジェクトを作成し、スライドを追加すれば作成可能です。

```python
from pptx import Presentation
from pathlib import Path

# Presentationオブジェクトの作成
prs = Presentation()
# スライドフォーマットの指定
slide_type = 0
# スライドの作成
slide_layout = prs.slide_layouts[slide_type]
# スライドをプレゼンに追加
slide = prs.slides.add_slide(slide_layout)
# pptxファイルを作成
prs.save(Path.cwd()/"test_pptx.pptx")
```

スライドは「text_pptx.pptx」として出力されるので、実際にスライドのあるpptxファイルが作られるところを見られます。

# スライドにコンテンツを追加

スライドを作成する際はテキストボックスなどにはプレースホルダーが入力されたままになります。プレースホルダーを使用するユースケースはあまり存在しないため、テキストや画像などで代入しました。
スライドにあるテキストボックスや画像は**shape**オブジェクト内で管理されています。各shapeに割り振られているidを指定することで該当するshapeを操作できます。例えば、shapeにテキストを入力したい場合はshapeにtextのプロパティがあるので、textを好きな文字列で置き換えると入力が可能です。

```python
# 操作する形を指定（タイトルテキストボックス）
title_shape_idx = 0
# タイトルテキストボックスに「テストタイトル」を設定
slide.shapes[title_shape_idx].text = "テストタイトル"
```

# クラスでスライドを大量生成

4000スライドのpptxファイルを作成するために、専用のクラスを作成しました。このクラスでは、スライドフォーマットの番号をクラス変数として持たせたり、スライドフォーマットごとに異なるshape構成に対応するメソッドを入れています。

以下は、そのクラスのサンプルコードです。

```python
class PptxFile:
    TITLE = 0
    TITLE_CONTENT = 1
    SECTION = 2
    TWO_CONTENT = 3
    COMPARISON = 4
    TITLE_ONLY = 5
    BLANK = 6
    CONTENT_CAPTION = 7
    PICTURE_CAPTION = 8

    def __init__(self):
        self.prs = Presentation()
        self.slide = None

    def add_title_slide(self,title:str="",subtitle:str=""):
        """タイトルスライドをプレゼンに追加する
        
        :param str title: タイトルの文字列
        :param str subtitle: サブタイトルの文字列
        """
        TITLE_PLACEHOLDER = 0
        SUBTITLE_PLACEHOLDER = 1
        self._add_slide(self.TITLE)
        self._insert_text(TITLE_PLACEHOLDER   ,title)
        self._insert_text(SUBTITLE_PLACEHOLDER,subtitle)

    def _add_slide(self,slide_type:int):
        """プレゼンにスライドを追加する
        
        :param int slide_type: スライドのフォーマットを示す整数
        """
        slide_layout = self.prs.slide_layouts[slide_type]
        self.slide = self.prs.slides.add_slide(slide_layout)

    def _insert_text(self,shape_idx:int,text:str):
        """文字列を形に挿入する
        
        :param int shape_idx: 形の番号
        :param str text: 形に挿入する文字列
        """
        self.slide.shapes[shape_idx].text = text

    def generate(self,filename:str="powerpoint"):
        """pptxファイルを出力
        
        :param str filename: pptxファイルの名前
        """
        output_file = Path.cwd() / (filename+".pptx")
        self.prs.save(output_file)
```

### クラスの特徴

1. **スライドフォーマットの定数化**
スライドフォーマットをクラス変数として定義することで、番号を覚える必要がない

2. **汎用メソッドの実装**
_add_slide や _insert_text など、共通の操作をメソッド化することで再利用性を高める

3. **簡単なファイル生成**
generate メソッドを呼び出すだけで、pptxファイルが簡単に生成される

# まとめ

実行に時間はかかりましたが、**4000スライド**のpptxをpython-pptxで作成することができました。ライブラリも扱いやすかったため、実際にpptxファイルを作れるようになるまではあっという間でした。


ただし、shapeの操作が少し複雑で、特にプレースホルダーに画像やテーブルを挿入する際に苦労しました。この部分については、公式ドキュメントを参照しても現状うまく動作しなかったため、今後再挑戦したいと思います。

---

# KIYOラーニング株式会社について

当社のビジョンは『世界一「学びやすく、分かりやすく、続けやすい」学習手段を提供する』ことです。革新的な教育サービスを作り成長させていく事で、オンライン教育分野でナンバーワンの存在となり、世界に展開していくことを目指しています。

https://kiyo-learning.com/

## プロダクト

* [スタディング](https://studying.jp/)：「学びやすく・わかりやすく・続けやすい」オンライン資格対策講座
* [スタディングキャリア](https://career.studying.jp/)：資格取得者の仕事探しやキャリア形成を支援する転職サービス
* [AirCourse](https://aircourse.com/)：受け放題の動画研修がついたeラーニングシステム（LMS）

### KIYOラーニング株式会社では一緒に働く仲間を募集しています

https://www.wantedly.com/companies/kiyo-learning/projects

https://herp.careers/v1/kiyolearning