<当サイト「Pythonでもっと自由を」のコンセプト>
本サイトは、現在人気No.1プログラミング言語である「Python」を使って、「日常の面倒な作業を自動化し効率アップを目指す!」ことを目標に、毎回さまざま役立つライブラリ(モジュール)を紹介しています。
なぜ? Pythonなのか・・・
・Pythonには、私たちのの身近なアプリケーションを操作し自動化をサポートしてくれるさまざまなライブラリ(モジュール)が提供されている。
・初心者でも理解しやすいスクリプト言語でありながら、本格的なオブジェクト指向の側面を合わせ持つバランスの良い言語である。
何を? 自動化する・・・
ビジネスシーンにおいて、もっとも身近に使われるアプリケーションといえば、、、真っ先に思い浮かべるものとしては、MS-Officeの「Excel」「Word」「PowerPoint」・・・あたりではないでしょうか?
毎日使う「定番必須ツール」だからこそ、これらに関わる作業の自動化や効率を上げることのインパクトは非常に大きいと言えます。
そこで今回の連載記事では、Officeのプレゼンテーションソフト「PowerPoint」を「Python」で操作するための方法を紹介していきたいと思います。
PowerPointには、とても多くの機能が搭載されていますので、本記事だけで全てを網羅することはできません。次のようなテーマに沿って複数回の連載記事にわたって図解を用いた詳細解説をしていきます。
さて、今回の連載1回目の記事では「ライブラリの導入とファイルとスライドの作成方法」
について紹介していきたいと思います。
この記事を読み進めることで次のようなことが「できる・わかる」ようになりますので最後までお付き合いください。python-pptxのクラスやオブジェクトの階層構造の概要を理解できる。
1. PowerPointを操作するライブラリ(python-pptx)の概要
PythonからPowerPointを操作するには「python-pptx」という外部ライブラリを使うのが定番です。python-pptxを使うことでPowerPointを起動することなくファイル作成や編集作業など、そのほとんどのことを行うことができます。
Office系アプリを制御できる、その他の言語には、.Net系のVisualBasic (VBAを含む)や、Python系に移植された「Pywin32」というライブラリもあります。これらは、Officeディベロッパーセンターの「VBAリファレンス」が参考になります。
一方、今回紹介するpython-pptxのクラスや関数・属性などは、それらとは全く異なる仕様になっています。python-pptxの公式ドキュメントは以下のURLとなりますので参考にしてください。
python-pptx 公式ドキュメント(API Document)
python-pptx — python-pptx 0.6.21 documentation
なお、本記事内で紹介する各種クラスや関数などの使い方は一例です。
省略可能なオプション引数などについては割愛していますので、詳細や不明点などは必要に応じて上記、公式ドキュメントを確認してください。
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.4.8
・Python3.10.6(64bit)
・python-pptx 0.6.21
・PIL(Python Imaging Library) 7.0.0
・xlswWriter 1.2.7
それでは、次節よりクラスやオブジェクトを使ってPowerPointを操作する方法を解説していきます。
2. python-pptxによるファイル作成~スライドの追加まで
本節ではpython-pptxの基本的な使い方について解説していきたいと思います。
python-pptxはオブジェクト指向に基づきコードを記述していくスタイルをとります。オブジェクト指向を採用しているため親(スーパ)クラスと子(サブ)クラスといったようにオブジェクトの階層化構造を常に意識する必要があります。
オブジェクトの階層化構造・・・少し難しいいですがPowerPointファイルを構成する各種要素(スライド、プレースフォルダ、コンテンツ各種・・・)に親子関係があるように(図2)、プログラムの部品であるオブジェクトにも親子の関係があり互いに関連しています。
例えば、Root(最上位)オブジェクトにはファイル本体となる、Presentationオブジェクト がきて、その下に各スライドを管理する Slideオブジェクト、さらにその下に、コンテンツ各種となる Shapeオブジェクト が配置されるといった具合です。(図3)
各階層の詳細については後述します。
2.1 プレゼンテーションの作成と保存
Python-pptxでは、プレゼンテーション(ファイル本体)の情報を、Presentationオブジェクトとして管理します。ですので、まずはRoot(最上位)オブジェクトである、Presentationオブジェクトを取得することになります。
オブジェクトを取得するには、Presentationクラス を次の書式のようにします。
さらに、編集・作成の目的に応じて、「(1)プレゼンテーションを新規作成する場合」と「(2)既存のプレゼンテーション(pptxファイル)を読込んで編集する場合」の2パターンがあると思います。前者は引数指定せずに、また後者は読込むファイルをパス付きのファイル名を指定します。
プレゼンテーションの作成・編集が終了したら最後に保存します。ファイルの保存は save()メソッド を次の書式のようにして使います。
引数:file には、保存するファイル名を指定します。また、既存ファイルを上書き保存する場合は、読込んだファイル名を指定します。上書き保存は特に警告メッセージは表示されませんので注意してください。
プレゼンテーションの作成と保存のイメージは次の図4のようになります。
2.2 スライド(Slideオブジェクト)の追加と取得
Presentationオブジェクトが取得できましたので、次はコンテンツの土台となるスライド(Slideオブジェクト)を追加・取得します。
Presentationオブジェクトでは、ファイルを構成する全てのスライドを Slidesコレクション (Slideオブジェクトを要素とするイテラブルなオブジェクト)で管理しています。
そのため、新しくスライドを追加する、もしくは既存のスライドを取得するには、まずSlidesコレクションにアクセスする必要があります。(図5)
コレクションは slidesプロパティ で得ることができます。(➀)コレクションの要素である個別Slideオブジェクトへはインデックスによる指定ができます。(②)また、新しいスライドを追加するには add_slide()メソッド を続けます。(➂) それぞれの書式は以下のとおりです。
Slidesコレクションに対する操作について補足します。
Slidesコレクションへの操作はこのadd_side()の追加のみとなります。想定される任意の位置にスライドを挿入する、移動する、別のファイルからスライドをコピーするといったことには対応できないようです。
add_slide()メソッドの 引数:slide_layout には、追加するスライドの雛形である SlideLayoutオブジェクト を設定します。
SlideLayoutオブジェクトは、slide_layoutsプロパティ により取得ができます。
SlideLayoutオブジェクトは、<図6><表1>のようなレイアウトの雛形情報を保持しています。次の書式のようにインデックスを指定して所望のオブジェクトを得ます。
PowerPointであらかじめ用意されているスライドの雛形(プレースフォルダ)は<図6><表1>の9種類になります。
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] | 題名付き画像 |
なお、スライドの雛形や対応するインデックスは、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”という変数で扱います。
14行目のLen()関数でSlidesコレクションの要素数(3)を確認します。
最後に、save()メソッド にて名前をつけて保存してpptxファイル出力します。
<List1>の実行結果は以下の通りとなります。
3枚の空欄の雛形(プレースフォルダ)をもつスライドが追加されたプレゼンテーションアフィルが出力されました。(図7)
2.3 プレースホルダ(Placeholder)の取得とコンテンツの設定
前項では、スライドを追加する際にその雛形であるSlideLayoutオブジェクトを指定しました。本項では、SlideLayoutオブジェクトの構成要素である、プレースフォルダ(Placeholderオブジェクト)についてもう少し掘り下げて解説します。
Slideオブジェクト~Placeholderオブジェクトの間には図8に示すようなオブジェクトの階層構造関係が成り立っています。
プレースフォルダには、たくさんの種類があって全部で19種類あるようです。その中でも、よく使うものは決まっていて以下のようなものがあります。
たとえば、PowerPointの既定のテンプレートは次のようなプレースフォルダで構成されています。(組合せや配置はマスタースライドの設定で自由に変更することが可能です)(図9)
個々のプレースフォルダを編集するには、対象のPlaceholderオブジェクトを取得する必要があり、placeholdersプロパティ にて対応します。スライド上の全てのプレースフォルダをしますので、インデックス指定して編集対象のオブジェクトを選びます。
Placeholderオブジェクトですが、実はコンテンツ種類(テキスト、グラフ、画像、テーブル)によってさらに4つのオブジェクトに分類されます。
これら、コンテンツに特化したオブジェクトに共通するプロパティには主なものに以下のようなものがあります。
Placeholderオブジェクト. | 機能 | その他・詳細 |
---|---|---|
.name | プレースフォルダ名を取得する | |
.placeholder_format.idx | インデックスを取得する | |
.placeholder_format.type | プレースフォルダの種類を取得する | PP_PLACEHOLDER定数 |
type属性は取得専用となりますので、フォルダの種類変更できません。
また、固有のメソッドには次のようなものがあります。テキスト・グラフ・画像・テーブルをホルダに挿入することができます。<図11>
【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') # 名前を付けて保存
それでは、ポイントを解説します。
<List2>の実行結果は以下のようになりました。
2枚のスライド(「タイトルとスライド」「2つのコンテンツ」)が新規追加され、タイトルにテキストが設定されました。
【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') # 名前を変更して別名で保存
それでは、ポイントを解説します。
9,10行目の nameプロパティ にて追加したスライドに含まれる、プレースフォルダの名前を確認します。(TITLE, PICTURE, BODY)
<List3>の実行結果は次のようになりました。
既存ファイルのに新たなスライドが追加され、PICTUREフォルダに画像が挿入されました。
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の連載についてはこちらから↓
最後までお読み頂きありがとうございました。