【PythonでPowerPointを操る】python-pptxの導入~ファイル・スライド作成方法を徹底解説

スポンサーリンク
Python外部ライブラリ(python-pptx)スライド作成の基本 Python

当サイト「Pythonでもっと自由を」のコンセプト

本サイトは、現在人気No.1プログラミング言語である「Python」を使って、「日常の面倒な作業を自動化し効率アップを目指す!ことを目標に、毎回さまざま役立つライブラリ(モジュール)を紹介しています。

なぜ? Pythonなのか・・・

・Pythonには、私たちのの身近なアプリケーションを操作し自動化をサポートしてくれるさまざまなライブラリ(モジュール)が提供されている。

・初心者でも理解しやすいスクリプト言語でありながら、本格的なオブジェクト指向の側面を合わせ持つバランスの良い言語である。

何を? 自動化する・・・

ビジネスシーンにおいて、もっとも身近に使われるアプリケーションといえば、、、真っ先に思い浮かべるものとしては、MS-Officeの「Excel」「Word」「PowerPoint」・・・あたりではないでしょうか?

Officeソフト群
図1 ビジネスシーンで多用されるOfficeソフト

毎日使う「定番必須ツール」だからこそ、これらに関わる作業の自動化や効率を上げることのインパクトは非常に大きいと言えます。


そこで今回の連載記事では、Officeのプレゼンテーションソフト「PowerPoint」を「Python」で操作するための方法とライブラリを紹介していきたいと思います。

PowerPointには、とても多くの機能が搭載されていますので、本記事だけで全てを網羅することはできません。次のようなテーマに沿って複数回の連載記事にわたって図解を用いた詳細解説をしていきます。

< 連載目次 >
  • 【連載1回目】ライブラリの導入とファイルとスライドの作成方法について ->>
  • 【連載2回目】段落にドキュメントを挿入しやフォントなどを設定する方法 ->>
  • 【連載3回目】スライドにグラフ(散布図や折れ線グラフ)を挿入する ->>
  • 【連載4回目】スライドにテーブル (表)を挿入する ->>
  • 【連載5回目】スライドに図形(オートシェイプ・画像・ボックス)を挿入する ->>

さて、今回の連載1回目の記事では「ライブラリの導入とファイルとスライドの作成方法

について紹介していきたいと思います。

この記事を読み進めることで次のようなことが「できる・わかる」ようになりますので最後までお付き合いください。python-pptxのクラスやオブジェクトの階層構造の概要を理解できる。

この記事で学べること
  • python-pptxライブラリの導入方法と概要を知ることができる
  • スライドの雛形にドキュメントを挿入する方法を習得できる
  • python-pptxのクラスやオブジェクトの階層構造の概要を理解できる
スポンサーリンク

1. PowerPointを操作するライブラリ(python-pptx)の概要

PythonからPowerPointを操作するにはpython-pptxという外部ライブラリを使うのが定番です。python-pptxを使うことでPowerPointを起動することなくファイル作成や編集作業など、そのほとんどのことを行うことができます。< python-pptxで出来ること>

< python-pptxで出来ること>
  • スライドの追加
  • プレースフォルダ(雛形)の追加と編集
  • テキストボックスの追加と編集
  • 図形(AutoShape)の追加と編集
  • グラフ・テーブル・画像の挿入

Office系アプリを制御できる、その他の言語には、.Net系のVisualBasic (VBAを含む)や、Python系に移植された「Pywin32」というライブラリもあります。これらは、Officeディベロッパーセンターの「VBAリファレンス」が参考になります。

一方、今回紹介するpython-pptxで仕様するクラスや関数・属性などは全く異なる仕様になっています。python-pptxの公式ドキュメントは以下のURLとなります。

python-pptx 公式ドキュメント(API Document)

https://openpyxl.readthedocs.io/en/stable/

なお、本記事内で紹介する各種クラスや関数などの使い方は一例です。

省略可能なオプション引数などについては割愛していますので、詳細や不明点などは必要に応じて上記、公式ドキュメントを確認してください。

1.1 インストールと動作確認

Python-pptxはAnacodaには同梱されていないのでpipや「setup.py」などを使ってインストールする必要があります。Anacondaプロンプトなどに次のコマンドを入力しインストールしてください。

pip install python-pptx

なお、setup.pyによる手動でのインストールは、依存関係のある他のパッケージ(PILやxlswWriter)の確認は行われないため、可能であれば「pip」コマンドによるインストールをお勧めします。

python setup.py

次に、適当なクラスをモジュールからインポートして動作確認をします。

インタプリタなどで、次の2行を入力し実行してみましょう。

from pptx import  Presentation
prs = Presentation()

この時点でエラーメッセージが表示されなければインストールが無事に行われたことになります。

記事内で動作確認した開発環境とバージョン情報は次のとおりとなります。異

なる環境やバージョンのライブラリをご使用の際はこの点をご留意ください。

・JupyterNotebook 6.0.3

・Python3.7.6(64bit)

・python-pptx 0.6.18

・PIL(Python Imaging Library) 7.0.0

・xlswWriter 1.2.7

それでは、次節よりクラスやオブジェクトを使ってPowerPointを操作する方法を解説していきます。

2. python-pptxのファイル作成~スライドの追加まで

Python_基本文法_内包表記

本節ではpython-pptxの基本的な使い方について解説していきたいと思います。

python-pptxはオブジェクト指向に基づきコードを記述していくスタイルをとります。オブジェクト指向を採用しているため親(スーパ)クラスと子(サブ)クラスといったようにオブジェクトの階層化構造を常に意識する必要があります。

オブジェクトの階層化構造・・・少し難しいいですがPowerPointファイルを構成する各種要素(スライド、プレースフォルダ、コンテンツ各種・・・)に親子関係があるように(図2)、プログラムの部品であるオブジェクトにも親子の関係があり互いに関係しあっています。

Python_PowerPointの構成要素_rev0.2
図2 PowerPointの構成要素と階層

例えば、Root(最上位)オブジェクトにはファイル本体となる、「Presentationオブジェクト」がきて、その下に各スライドを管理する「Slideオブジェクト」、さらにその下に、コンテンツ各種となるShapeオブジェクトが配置されるといった具合です。(図3)

各階層の詳細については後述します。

Python_pptxのオブジェクト階層構造_rev0.2
図3 python-pptxのオブジェクトの階層構造

2.1 プレゼンテーションの作成と保存

Python-pptxでは、プレゼンテーション(ファイル本体)の情報を、Presentationオブジェクトとして管理します。ですので、まずはRoot(最上位)オブジェクトである、Presentationオブジェクトを取得することになります。

オブジェクトを取得するには、Presentationクラスを次の書式のようにします。

Presentationオブジェクトの取得

from pptx import Presentation

Presentation(pptx)


引数: pptx : 読込む既存のpptxファイル名をパス付きで指定 ※

戻り値:Presentationオブジェクト

※引数は既存のpptxを読込んで編集などを行う場合に指定します。カレントフォルダ以外のファイルを読む場合はパス付きで指定します。新規作成の場合は引数指定はしません。

さらに、編集・作成の目的に応じて、「(1)プレゼンテーションを新規作成する場合」と「(2)既存のプレゼンテーション(pptxファイル)を読込んで編集する場合」の2パターンがあると思います。前者は引数指定せずに、また後者は読込むファイルをパス付きのファイル名を指定します。

プレゼンテーションの作成・編集が終了したら最後に保存します。ファイルの保存はsave()メソッドを次の書式のようにして使います。

Presentationオブジェクトの保存

Presentationオブジェクト.save(file)


引数: file保存したいpptxファイル名を指定 ※

上書き保存の場合でもFileNameを指定します。

また、カレントフォルダ以外の場所に保存する場合はバス付きで指定します。

「引数file」には、保存するファイル名を指定します。また、既存ファイルを上書き保存する場合は、読込んだファイル名を指定します。上書き保存は特に警告メッセージは表示されませんので注意してください。

プレゼンテーションの作成と保存のイメージは次の図4のようになります。

presentaionクラス_save関数のイメージ
図4 Presentationオブジェクトとsave関数の引数指定

2.2 スライド(Slideオブジェクト)の追加と取得

Presentationオブジェクトが取得できましたので、次はコンテンツの土台となるスライド(Slideオブジェクト)を追加・取得します。

Presentationオブジェクトでは、ファイルを構成する全てのスライドをSlidesコレクション(Slideオブジェクトを要素とするイテラブルなオブジェクト)で管理しています。

そのため、新しくスライドを追加する、もしくは既存のスライドを取得するには、まずSlidesコレクションにアクセスする必要があります。(図5)

Python_SlidesコレクションとSlideオブジェクト_rev0.1
図5 SlidesコレクションとSlideオブジェクトの関係

コレクションは「slidesプロパティ」で得ることができます。()コレクションの要素である個別Slideオブジェクトへはインデックスによる指定ができます。()また、新しいスライドを追加するには「add_slide()メソッド」を続けます。() それぞれの書式は以下のとおりです。

Slidesコレクション

.Slidesコレクションの取得

Presentationオブジェクト.slides

戻り値:コレクション(Slidesオブジェクト)


.既存のスライドを取得

Presentationオブジェクト.slides[index]

引数: index:定のスライドを識別するためのインデックスを指定(1ページ目を0とする)

戻り値:Slideオブジェクト(既存のスライド)


.新しいスライドの追加

Presentationオブジェクト.slides.add_slide(slide_layout)

引数: slide_layout: SlideLayoutオブジェクトを指定する

戻り値:Slideオブジェクト(追加したスライド)

Slidesコレクションに対する操作について補足します。

Slidesコレクションへの操作はこのadd_side()の追加のみとなります。想定される任意の位置にスライドを挿入する、移動する、別のファイルからスライドをコピーするといったことには対応できないようです。

add_slide()メソッドの引数slide_layoutには、追加するスライドの雛形であるSlideLayoutオブジェクトを設定します。

SlideLayoutオブジェクトは、slide_layoutsプロパティにより取得ができます。

SlideLayoutオブジェクトもまた、<図6>,<表1>のように個別のレイアウト情報を要素とするコレクションなので、インデックス指定で所望の雛形を選びます。

SlideLayoutオブジェクト

Presentationオブジェクト.slide_layouts[num]


引数: num : スライドの雛形を0~8の9種類の中から選ぶ(図6, 表1)を参照

戻り値:SlideLayoutオブジェクト

PowerPointであらかじめ用意されているスライドの雛形(プレースフォルダ)は<図6><表1>の9種類になります。

python-pptx layoutオブジェクト
図6 スライドの雛形の種類
 Presentaionオブジェクト.slide_layouts[num] コンテンツ(プレースフォルダ)の種類 
slide_layouts[0]タイトルとスライド
slide_layouts[1]タイトルとコンテンツ
slide_layouts[2]セクションヘッダ
slide_layouts[3]2つのコンテンツ
slide_layouts[4]比較
slide_layouts[5]タイトルのみ
slide_layouts[6]白紙
slide_layouts[7]題名付きコンテンツ
slide_layouts[8]題名付き画像
表1 slide_layoutsの対応コンテンツ(プレースフォルダ)

なお、スライドの雛形や対応するインデックスは、PowerPointの「スライドマスタビュー」(「表示タブ」→「スライドマスター」)から自由に変更することができます。


SAMPLE➀

ここまでの内容を具体的なサンプルコードで確認してみましょう。

コードの概要は、3枚の雛形のみのスライドを持つプレゼンテーションを作成して保存するといった基本的なものです。<List1>

from pptx import Presentation

prs = Presentation()		# Presentationオブジェクトの取得

#---------------------------------------------------------------------------------------------------------------------------------------------------------------
title_slide_layout = prs.slide_layouts[0]	# "タイトルとスライド"のレイアウトオブジェクトを取得
prs.slides.add_slide(title_slide_layout)	# 新しいスライドを追加("タイトルとスライド")

#---------------------------------------------------------------------------------------------------------------------------------------------------------------
two_title_layout = prs.slide_layouts[3]	# "2つコンテンツ"のレイアウトオブジェクトを取得
prs.slides.add_slide(two_title_layout)	# 新しいスライドを追加("2つコンテンツ")

#---------------------------------------------------------------------------------------------------------------------------------------------------------------
comp_layout = prs.slide_layouts[4]	# "比較コンテンツ"のレイアウトオブジェクトを取得
prs.slides.add_slide(comp_layout)	# 新しいスライドを追加(比較コンテンツ")

#---------------------------------------------------------------------------------------------------------------------------------------------------------------
print(len(prs.slides)) 		# スライドオブジェクトのコレクションの要素数 >>3

for slide in prs.slides:
    print(type(slide))			# オブジェクトの種類はSlideオブジェクト >> <class 'pptx.slide.Slide'>
    print('slide_index [',prs.slides.index(slide), ']')		# スライドのインデックスを調べる >> slide_index [ 0 ], slide_index [ 1 ], slide_index [ 2 ] 

#---------------------------------------------------------------------------------------------------------------------------------------------------------------
prs.save('sample.pptx')	# 名前をつけてpptxファイルとして保存

ポイントを解説します。

1,3行目で、Presentationクラスの導入とオブジェクトを生成し以降”prs”という変数で扱います。

5,6行目: 【スライドの追加】

スライドの雛形となるSlideLayoutオブジェクトを取得します。ここでは、インデックスに「0」を指定しているので、「タイトルとスライド」のコンテンツをもつ雛形になります。

次に6行目でslides.add_slide()の引数に先のSlideLayoutオブジェクトを設定して、新規スライドを追加します。10,11/14,15行目も同様です。

14行目のLen()関数でSlidesコレクションの要素数(3)を確認します。

20,22行目: 【スライドの属性確認】

For文にてSlidesコレクションのイテレーションさせ、個々のSlideオブジェクトに分解します。「type()関数」と「index()メソッド」によりそれぞれ、オブジェクトのタイプと、インデックスを確認・表示させます。

最後に、save()メソッドにて名前をつけて保存してpptxファイル出力します。

<List1>の実行結果は以下の通りとなります。

3枚の空欄の雛形(プレースフォルダ)をもつスライドが追加されたプレゼンテーションアフィルが出力されました。(図7)

スライドの追加のイメージ
図7 <List1>の実行結果

2.3 プレースホルダ(Placeholder)の取得とコンテンツの設定

前項では、スライドを追加する際にその雛形であるSlideLayoutオブジェクトを指定しました。本項では、SlideLayoutオブジェクトの構成要素である、プレースフォルダ(Placeholderオブジェクト)についてもう少し掘り下げて解説します。

Slideオブジェクト~Placeholderオブジェクトの間には図8に示すようなオブジェクトの階層構造関係が成り立っています。

placeholderオブジェクト周辺の階層構造
図8 Placeholderオブジェクトの上位階層

プレースフォルダには、たくさんの種類があって全部で19種類あるようです。その中でも、よく使うものは決まっていて以下のようなものがあります。

主要なブレースフォルダ
  • TITLE, CENTER_TITLE, SUBTITLE, BODY ・・・テキスト
  • PICTURE ・・・画像
  • CHART ・・・グラフ
  • TABLE ・・・テーブル(表)

たとえば、PowerPointの既定のテンプレートは次のようなプレースフォルダで構成されています。(組合せや配置はマスタースライドの設定で自由に変更することが可能です)(図9)

Python_Slidelayoutの中のプレースフォルダ_rev0.1
図9 SlideLayoutの中のプレースフォルダ

個々のプレースフォルダを編集するには、対象のPlaceholderオブジェクトを取得する必要があり、placeholdersプロパティにて対応します。スライド上の全てのプレースフォルダをしますので、インデックス指定して編集対象のオブジェクトを選びます。

Placeholderオブジェクトの取得

Slideオブジェクト.placeholdersプロパティ

戻り値:コレクション(Placeholderオブジェクト)


Slideオブジェクト.placeholders[num]

引数: numスライド上のプレースフォルダーの識別番号(インデックス)

戻り値:Placeholderオブジェクト

Placeholderオブジェクトですが、実はコンテンツ種類(テキスト、グラフ、画像、テーブル)によってさらに4つのオブジェクトに分類されます。

Python_Placeholderオブジェクトの種類_rev0.1
図10 Placeholderオブジェクトの種類

これら、コンテンツに特化したオブジェクトに共通するプロパティには主なものに以下のようなものがあります。

Placeholderオブジェクト. 機能その他・詳細
.nameプロパティプレースフォルダ名を取得する
.placeholder_format.idxプロパティインデックスを取得する
.placeholder_format.typeプロパティプレースフォルダの種類を取得するPP_PLACEHOLDER定数
表2 Placefolderオブジェクトの共通プロパティ

type属性は取得専用となりますので、フォルダの種類変更できません。

また、固有のメソッドには次のようなものがあります。テキスト・グラフ・画像・テーブルをホルダに挿入することができます。<図11>

Python_Placeholderの固有メソッド一覧_rev0.1
図11 Placeholderオブジェクト各種の固有メソッド

SAMPLE②

ここで、Placeholderオブジェクトを使用する具体的なサンプルコードを紹介します。

コードの概要は、まずはpptxファイルを新規作成し、スライド2枚を追加します。次に各スライド内のプレースフォルダの属性を確認した後、「TITLE」にテキストを設定します。

from pptx import Presentation

prs = Presentation()

#------------------------------------------------------------------------------------------------------
title_slide_layout = prs.slide_layouts[0]        # "タイトルとスライド"のSlideLayoutオブジェクトを取得
sld0 = prs.slides.add_slide(title_slide_layout)  # 新規スライドを追加

for p in sld0.placeholders:  # スライド内の個別PlaceFoldeオブジェクトを展開
    print(p.name)  # フォルダ名を取得
    # >>Title 1, Subtitle 2
    
    print(p.placeholder_format.idx, p.placeholder_format.type)  # インデックスと種類を取得
    # >>0 CENTER_TITLE (3), 1 SUBTITLE (4)

#------------------------------------------------------------------------------------------------------
title_slide_layout = prs.slide_layouts[3]        # "2つコンテンツ"のSlideLayoutオブジェクトを取得
sld1 = prs.slides.add_slide(title_slide_layout)  # 新規スライドを追加  

for p in sld1.placeholders:  # スライド内の個別PlaceFoldeオブジェクトを展開
    print(p.name)  # フォルダ名を取得    
    # >>Title 1, Content Placeholder 2, Content Placeholder 3
    
    print(p.placeholder_format.idx, p.placeholder_format.type)  # インデックスと種類を取得
    # >>0 TITLE (1), 1 OBJECT (7), 2 OBJECT (7)

#------------------------------------------------------------------------------------------------------
title = sld0.placeholders[0]                     # スライド1のTitle1のPlaceFolderオブジェクトの取得
title.text = "「タイトルとスライド」のスライド"     # テキストを設定

title = sld1.placeholders[0]                     # スライド2のTitle1のPlaceFolderオブジェクトの取得
title.text = "「2つのコンテンツ」のスライド"       # テキストを設定

prs.save('Blog_スライドの追加とファイルの保存.pptx')   # 名前を付けて保存

それでは、ポイントを解説します。

6,7行目:新規スライドを追加

SlideLayoutオブジェクト([0]“タイトルとレイアウト”)を指定して、add_slide()メソッドで新規スライドを追加します。

17,18行目でも同様に2枚目のスライド([3]“2つのコンテンツ”)を追加しています。

9,10,13行目:プレースフォルダの属性を確認

placeholdersプロパティでスライド内の全てのフォルダ情報をFor文で展開します。その後、個別オブジェクトに対するnameプロパティで、フォルダ名を調べます。20,21,24行目も同様です。

28,29行目:TITLEフォルダにテキストを設定

フォルダ名の調査結果から、各スライドの1番目のフォルダが”TITLE”であることが分かったので、textプロパティによってテキストを設定しています。31,32行目も同様です。

<List2>の実行結果は以下のようになりました。

2枚のスライド(「タイトルとスライド」「2つのコンテンツ」)が新規追加され、タイトルにテキストが設定されました。

python-pptxの使い方_スライドの保存とファイルの保存
図12 List2の実行結果

SAMPLE ➂

もう一つサンプルコードを紹介します。

コードの概要は次のとおりです。<List2>の出力結果(pptxファイル)を読込んで、スライド(タイトル付き図)を新たに追加します。そして、「PICTURE」のプレースフォルダに画像を挿入し、名前を付けて別名で保存するものです。

from pptx import Presentation

prs = Presentation('Blog_スライドの追加とファイルの保存.pptx')  # 既存のファイルを読み込む
#------------------------------------------------------------------------------------------------------
title_slide_layout = prs.slide_layouts[8]         # "タイトル付き図"のレイアウトオブジェクトを取得
sld2 = prs.slides.add_slide(title_slide_layout)      #  新しいスライドを追加
print(len(prs.slides))  				 # スライド数の表示 >>3

for p in sld2.placeholders:                 # シート内のプレースフォルダ名を取得
    print(p.name)               			  # >>Title 1 Picture Placeholder 2 Text Placeholder 3

#------------------------------------------------------------------------------------------------------
sld2.placeholders[0].text = 'タイトル付き図のスライド'             
sld2.placeholders[1].insert_picture('ビジネス_アイコン.png') # 画像ファイルを画像プレースフォルダーに貼り付ける
sld2.placeholders[2].text = '画像が貼り付けられました'              

prs.save('Blog_既存ファイルの取得と画像の貼り付け.pptx')    # 名前を変更して別名で保存

それでは、ポイントを解説します。

3行目:【既存ファイルの読込み】

Presentaionクラスの引数に、既存ファイル名を指定して読み込みます。

スクリプトの実行Pathと異なる場所のファイルを読む場合はPath付き(相対・絶対パス)で指定します。

5,6行目:【新規スライドの追加】

add_slide()メソッドにて新規スライド([8]“タイトル付き図”)を追加します。

9,10行目のnameプロパティにて追加したスライドに含まれる、プレースフォルダの名前を確認します。(TITLE, PICTURE, BODY)

13~15行目:【コンテンツの挿入】

TITLE,BODYには「textプロパティ」でテキストを設定し、PICTUREにはinsert_picture()メソッドで画像を挿入します。

<List3>の実行結果は次のようになりました。

既存ファイルのに新たなスライドが追加され、PICTUREフォルダに画像が挿入されました。

python-pptxの使い方_ファイル読込みと画像の貼り付け
図13 List3の実行結果

3. まとめ

いかがでしたでしょうか?

今回は「python-pptxライブラリ」を使ってPowerPointを操作するための基本事項として、「プレゼンテーションの作成」「スライドの追加」「プレースフォルダを使ってのコンテンツ作成」について解説をしてきました。

これだけでも、最低限のプレゼンテーションファイルを作成できることを実感頂けたと思います。

最後に、今回の記事のポイントを押さえておきましょう。

➀.python-pptxでは、ファイル本体であるPresentationオブジェクトをトップ階層とします。さらに、その配下にはSlideオブジェクト、SlideLayoutオブジェクト、Placeholderオブジェクト・・・と続く階層構造をもつオブジェクト指向型ライブラリである。

➁.PowerPointには、あらかじめ既定のスライド(雛形・プレースフォルダ)が用意されている。これを活用することで簡易的なプレゼンテーションの作成が可能となる。

python-pptxでは、SlideLayout/Placeholderオブジェクトが提供され適用する。

python-pptxの基本が分かったところで、以降の連載から「より実用的な活用事例」を紹介していきます。

次回は、PowerPointにテキストを挿入する方法を紹介します。

PowerPointといえば、図や表を用いて、グラフィカルに訴える資料づくりが基本となりますが、要点の箇条書き・結論や補足文など、アピール・強調したい部分には「テキスト」を適切に使うことが肝要です。

そんな方法をまとめたのが以下の記事となります。

ぜひ、次回もお読みください。


また、今回のPowerPoint以外にも「Excel」や「Word」を操作するライブラリについての連載記事もあります。 Officeの3大ソフトをPythonで操作して作業の効率化を目指していきましょう!

〇Excelの連載についてはこちらから↓

〇Wordの連載についてはこちらから↓

最後までお読み頂きありがとうございました。

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