29
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2025-03-17

イントロ

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

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

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

python-pptxとは?

python-pptx はpptxファイルを作成読み込み更新するPythonライブラリです。英語で書かれていますが、公式ドキュメントはこちら です。2013年にプレリリースされたライブラリで、2024年8月に新しいバージョンをリリースしています。

image.png
python-pptxのリリース履歴

スライドの作り方

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

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を好きな文字列で置き換えると入力が可能です。

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

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

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

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

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ラーニング株式会社について

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

プロダクト

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

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

29
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
29
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?