イントロ
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月に新しいバージョンをリリースしています。
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)
クラスの特徴
-
スライドフォーマットの定数化
スライドフォーマットをクラス変数として定義することで、番号を覚える必要がない -
汎用メソッドの実装
_add_slide や _insert_text など、共通の操作をメソッド化することで再利用性を高める -
簡単なファイル生成
generate メソッドを呼び出すだけで、pptxファイルが簡単に生成される
まとめ
実行に時間はかかりましたが、4000スライドのpptxをpython-pptxで作成することができました。ライブラリも扱いやすかったため、実際にpptxファイルを作れるようになるまではあっという間でした。
ただし、shapeの操作が少し複雑で、特にプレースホルダーに画像やテーブルを挿入する際に苦労しました。この部分については、公式ドキュメントを参照しても現状うまく動作しなかったため、今後再挑戦したいと思います。
KIYOラーニング株式会社について
当社のビジョンは『世界一「学びやすく、分かりやすく、続けやすい」学習手段を提供する』ことです。革新的な教育サービスを作り成長させていく事で、オンライン教育分野でナンバーワンの存在となり、世界に展開していくことを目指しています。
プロダクト
- スタディング:「学びやすく・わかりやすく・続けやすい」オンライン資格対策講座
- スタディングキャリア:資格取得者の仕事探しやキャリア形成を支援する転職サービス
- AirCourse:受け放題の動画研修がついたeラーニングシステム(LMS)
KIYOラーニング株式会社では一緒に働く仲間を募集しています