【Python】パワポファイルを生成するpython-pptxの使い方

Python
この記事は約19分で読めます。

こんにちは、JS2IIUです。
機械学習エンジニアやデータサイエンティストの皆さん、日々の業務お疲れ様です。Pythonで高度なデータ分析やモデル構築を行い、素晴らしいインサイトを得た後、最後に待っているのが「PowerPointでの報告資料作成」です。

「Jupyter Notebookのグラフを画像保存して、パワポに貼り付けて、サイズを調整して、数値を表に入力して……」
この単純作業に、貴重なエンジニアリングリソースを割くのは非常にもったいないことです。

今回は、この「ラストワンマイル」をPythonで自動化するライブラリ、python-pptxについて徹底解説します。Pandasとの連携も含め、実務ですぐに使えるテクニックを紹介していきます。今回もよろしくお願いします。

1. python-pptx とは

ライブラリの概要

python-pptxは、Microsoft PowerPointファイル(.pptx)を作成・読み込み・更新するためのPythonライブラリです。
PowerPointがインストールされていない環境(Linuxサーバー上のDockerコンテナなど)でも動作するため、サーバーサイドで定期的にレポートを自動生成してメール送信するといったシステム構築が可能です。

GitHub - scanny/python-pptx: Create Open XML PowerPoint documents in Python
Create Open XML PowerPoint documents in Python. Contribute to scanny/python-pptx development by creating an account on GitHub.

python-pptxのStar Historyです。こちらの図は2025年11月時点のものです。

主な特徴

  • 新規作成と編集: ゼロからのファイル作成だけでなく、既存の.pptxファイルをテンプレートとして読み込み、特定の部分だけ書き換えることができます。
  • 豊富な要素: テキストボックス、図形、画像、表(Table)、グラフ(Chart)など、PowerPointの主要な機能を操作できます。

ライセンスについて

このライブラリは MIT License で公開されています。
MITライセンスは非常に寛容なライセンスであり、著作権表示など条件を守れば、商用・非商用を問わず、誰でも無償で自由に使用、改変、再配布することができます。企業のプロジェクトでも安心して導入しやすいライブラリです。

概念図:オブジェクトの階層構造

コーディングに入る前に、python-pptxがどのようにファイルを認識しているか、メンタルモデルを持っておきましょう。

Presentation(プレゼンテーション全体)
 └ Slides(スライドのリスト)
   └ Slide(個別のスライド)
     └ Shapes(図形、テキスト、画像、表などの要素)

コードを書く際は、まず「プレゼンテーション」を作り、そこに「スライド」を追加し、さらにそのスライドの上に「シェイプ(要素)」を乗せていく、という手順になります。

2. 環境構築

まずはライブラリをインストールしましょう。今回はデータ処理用にpandasも使用するため、併せてインストールします。

Bash
pip install python-pptx pandas

3. 【実践】基本的なスライドの作成

それでは、実際にコードを書いてみましょう。
まずは、「タイトルスライド」と「箇条書きのあるスライド」を含むシンプルなPowerPointファイルを生成します。

基本実装コード

Python
from pptx import Presentation
from pptx.util import Inches, Pt

def create_basic_presentation(output_filename):
    """
    基本的なPowerPointファイルを作成する関数
    """
    # 1. Presentationオブジェクト(パワポ全体)の生成
    prs = Presentation()

    # --- 1枚目:タイトルスライド ---
    # slide_layouts[0] は通常「タイトルスライド」のレイアウト
    title_slide_layout = prs.slide_layouts[0]
    slide1 = prs.slides.add_slide(title_slide_layout)

    # タイトルとサブタイトルのプレースホルダーを取得して書き込み
    title = slide1.shapes.title
    subtitle = slide1.placeholders[1]

    title.text = "週次AIモデル精度報告"
    subtitle.text = "自動生成レポート by Python"

    # --- 2枚目:コンテンツスライド(タイトル+コンテンツ) ---
    # slide_layouts[1] は通常「タイトルとコンテンツ」のレイアウト
    bullet_slide_layout = prs.slide_layouts[1]
    slide2 = prs.slides.add_slide(bullet_slide_layout)

    # タイトルの設定
    slide2.shapes.title.text = "今週のハイライト"

    # 本文(プレースホルダー)への書き込み
    body_shape = slide2.placeholders[1]
    tf = body_shape.text_frame
    tf.text = "モデルAの精度が向上しました"  # 1行目

    # 箇条書きの追加
    p = tf.add_paragraph()
    p.text = "データセットのクリーニング完了"
    p.level = 1  # インデントレベル(1段下げる)

    p = tf.add_paragraph()
    p.text = "推論速度の改善(15% Up)"
    p.level = 1

    # --- ファイルの保存 ---
    prs.save(output_filename)
    print(f"Saved: {output_filename}")

if __name__ == "__main__":
    create_basic_presentation("basic_report.pptx")

コードの詳細解説

  1. Presentation(): これがPowerPointファイルそのものです。既存のファイルを読み込む場合は Presentation('existing_file.pptx') とします。
  2. slide_layouts: PowerPointには「タイトルスライド」「白紙」などのレイアウトテンプレートがあります。python-pptxではインデックス番号で指定します。
    • 0: タイトルスライド
    • 1: タイトルとコンテンツ
    • 6: 白紙
    • ※テンプレートによって順番が異なる場合があるため、実務ではテンプレートを確認する必要があります。
  3. placeholders: レイアウトにあらかじめ用意されている枠(タイトル枠や本文枠)です。これらを取得して .text プロパティに文字列を代入することで文字を表示させます。

このコードを実行すると、カレントディレクトリに basic_report.pptx が生成されます。これだけでも、定型文の流し込み作業は自動化できますね。

4. 【応用】Pandas データフレームをPowerPointの表に出力する

ここからがテックブログ読者の皆様にとっての本題です。
AI開発やデータ分析では、Pandasで作った集計表(DataFrame)をスライドに貼る作業が頻繁に発生します。これを自動化しましょう。

python-pptxには表を作成する機能がありますが、セル一つひとつに値をセットしていく必要があり、少し記述が冗長になりがちです。そこで、DataFrameを渡すと自動的にPowerPointの表に変換する関数を作成します。

Pandas連携の実装コード

Python
import pandas as pd
from pptx import Presentation
from pptx.util import Inches
from pptx.enum.text import PP_ALIGN

def df_to_pptx_table(slide, df, left, top, width, height):
    """
    Pandas DataFrameをPowerPointのスライド上にテーブルとして描画する関数

    Args:
        slide: 追加対象のスライドオブジェクト
        df: データを含むPandas DataFrame
        left, top: テーブルの左上の位置
        width, height: テーブル全体のサイズ
    """
    # 行数と列数を計算(ヘッダー分として行数に+1)
    rows, cols = df.shape
    rows += 1 

    # テーブルシェイプの追加
    table_shape = slide.shapes.add_table(rows, cols, left, top, width, height)
    table = table_shape.table

    # --- ヘッダーの書き込み ---
    for col_idx, col_name in enumerate(df.columns):
        cell = table.cell(0, col_idx)
        cell.text = str(col_name)
        # デザイン調整(任意):太字にするなど
        cell.text_frame.paragraphs[0].font.bold = True
        cell.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER

    # --- データの中身(ボディ)の書き込み ---
    for row_idx in range(df.shape[0]):
        for col_idx in range(df.shape[1]):
            # tableの行インデックスはヘッダーの分だけ +1 ズレることに注意
            cell = table.cell(row_idx + 1, col_idx)

            # DataFrameの値を文字列に変換してセット
            val = df.iloc[row_idx, col_idx]

            # 数値のフォーマット調整(例:小数は丸める)
            if isinstance(val, float):
                cell.text = f"{val:.2f}"
            else:
                cell.text = str(val)

            # 中央揃え
            cell.text_frame.paragraphs[0].alignment = PP_ALIGN.CENTER

def create_data_report(output_filename):
    # サンプルデータの作成(PyTorchなどの実験結果を想定)
    data = {
        'Model': ['ResNet50', 'EfficientNet-B0', 'ViT-Base'],
        'Accuracy': [0.8954, 0.9120, 0.9345],
        'Inference Time (ms)': [25.4, 18.2, 35.6],
        'Parameters (M)': [25.6, 5.3, 86.6]
    }
    df = pd.DataFrame(data)

    # プレゼンテーション作成
    prs = Presentation()

    # 白紙のスライドを追加 (レイアウト6番)
    blank_slide_layout = prs.slide_layouts[6]
    slide = prs.slides.add_slide(blank_slide_layout)

    # タイトルをテキストボックスとして追加
    title_box = slide.shapes.add_textbox(Inches(1), Inches(0.5), Inches(8), Inches(1))
    title_box.text_frame.text = "モデル性能比較テーブル"
    title_box.text_frame.paragraphs[0].font.size = Pt(24)
    title_box.text_frame.paragraphs[0].font.bold = True

    # DataFrameをテーブルとして出力
    # 位置とサイズを指定 (Inchesで指定すると直感的)
    df_to_pptx_table(
        slide, 
        df, 
        left=Inches(1), 
        top=Inches(2), 
        width=Inches(8), 
        height=Inches(3)
    )

    prs.save(output_filename)
    print(f"Saved: {output_filename}")

if __name__ == "__main__":
    create_data_report("pandas_table_report.pptx")

解説とポイント

  • df_to_pptx_table関数: この関数が肝です。table.cell(row, col) で特定のセルにアクセスし、.text で値を入れます。
  • インデックスの管理: PowerPointのテーブルには「ヘッダー行」を含める必要があるため、ループ処理の際はDataFrameの行インデックスと、PowerPointテーブルの行インデックスが1つずれる点(row_idx + 1)に注意が必要です。
  • InchesPt: PowerPoint上の位置やサイズは、ピクセルではなくインチ(Inches)やポイント(Pt)で指定するのが一般的です。これにより、印刷時やプロジェクター投影時のレイアウト崩れを防ぎやすくなります。

このスクリプトを使えば、実験が終わるたびにCSVを手動でコピペする必要はなくなります。実験スクリプトの最後にこのコードを呼び出せば、朝起きたときにはレポートが完成している状態を作れます。

5. python-pptx の活用事例

単にスライドを作るだけでなく、以下のような応用が考えられます。

定型レポートの完全自動化

週次、月次のKPI報告など、フォーマットが決まっているものは自動化の絶好の対象です。SQLでデータを取得し、Pandasで整形し、python-pptxで出力まで一気通貫で行えます。

テンプレートファイルの活用(おすすめ!)

コードだけで美しいデザイン(フォント、色、ロゴ配置)を作るのは大変です。
実務では、デザイナーや広報部門が作成した「会社指定のPowerPointテンプレート(.pptx)」を読み込み、その中の特定のプレースホルダーだけにデータを流し込む方法が最も効率的です。

Python
# 既存のデザインテンプレートを読み込む
prs = Presentation("company_template.pptx")

こうすることで、デザインの変更があった場合もPythonコードを修正する必要がなくなり、メンテナンス性が向上します。

まとめ

今回は、PythonでPowerPointを作成するpython-pptxについて、基本操作からPandas連携まで解説しました。

今回のポイント:

  • python-pptxを使えば、サーバーサイドでもPowerPoint生成が可能。
  • オブジェクト構造(Presentation > Slide > Shape)を理解することが重要。
  • Pandas DataFrameをテーブルに変換するヘルパー関数を作ると、AI開発のレポーティングが捗る。
  • デザインはコードで頑張らず、テンプレートファイルを読み込むのがプロのコツ。

プログラミングの力は、高度なアルゴリズムを実装するためだけでなく、こういった「日々の定型業務」をハックするためにも大いに役立ちます。空いた時間で、より本質的な分析やモデルの改善に取り組みましょう。

最後まで読んでいただきありがとうございました。

コメント

タイトルとURLをコピーしました