PowerPoint(パワポ)ドキュメント作成をPythonで自動化する方法について紹介します。
Python-pptxと呼ばれるモジュールを使用することで、Pythonでパワポを操作することが出来るようになります。
恐らく、多くの人がパワポで資料を作らなくてはいけない場面があると思います。パワポの場合、Pythonで自動化するよりも、手作業で行う方必要がある作業は多いかもしれません。
しかし、何個も図を張り付けたり、パワポ上で似たようなグラフを作成したり、というような単純作業を繰り返し行わなくてはいけない・・・といったこともあるかと思います。このような場合は、Pythonで自動化出来ます。
今回は、Pythonのパワポを操作するモジュールPython-pptxを使用して、簡単なドキュメントを作成する方法を紹介します。
Pythonでパワポを自動化:Python-pptxのインストール
Anacondaでインストールする
conda install -c conda-forge python-ppt
pipでインストール
pip install python-pptx
PythonでPowerpointを自動化:タイトルページの作成
まずは、Python-pptxでPowerPointドキュメントのタイトルページを作成してみましょう。
Python-pptxでPowerPointを操作するプログラムの大まかな流れは次のようになります。
- Presentationオブジェクト作成
- PresentationオブジェクトにSlideオブジェクトを追加
- Slideオブジェクトにタイトル、テキスト等の要素を追加
ソースコードと作成されるスライド
まず、パワーポイントを新規作成し、タイトルスライドを追加し、タイトルとサブタイトルを入れてみましょう。
from pptx import Presentation
from pptx.util import Cm
#Presentaionオブジェクトを生成
ppt = Presentation()
#スライドのサイズを指定
ppt.slide_width = Cm(33.867)
ppt.slide_height = Cm(19.05)
#追加するスライドを選択
slide_layout_0 = ppt.slide_layouts[0]
#追加するスライドを選択
slide_layout_0 = ppt.slide_layouts[0]
#スライドを追加#
slide_0 = ppt.slides.add_slide(slide_layout_0)
slide_0_title = slide_0.placeholders[0]
print(type(slide_0_title))
slide_0_title.width = Cm(25.4)
slide_0_title.height = Cm(6.63)
slide_0_title.text = "HOGEHOGE"
slide_0_subtitle = slide_0.placeholders[1]
slide_0_subtitle.text = "FOOFOO"
slide_0_subtitle.text += "FOOFOO"
ppt.save("./test.pptx")
上のコードを実行すると、このようなタイトルページができます。
Presentationオブジェクトの作成
1行目でPresentationをモジュールをインポートし、5行目でPresentationオブジェクトを生成しています。変数pptにはPresentationオブジェクトが格納されます。
8行目、9行目でPresentationオブジェクトのslide_width、slide_lengthメソッドで、スライドのサイズを設定しています。スライドの横幅:縦幅 = 16:9となるように、横 = 33.867 cm、縦 = 19.05 cmとしました。
Python-pptxでのデフォルト単位は、emu(English Metric Units)という単位です。emuは私達にはあまりなじみが単位で、1 cm = 360000 emuです。私はセンチメールの方が扱いやすいので、2行目でCmをインポートし、センチメートルで長さを指定できるようにしています。
PowerPointでは、デザインタブの「スライドのサイズ」をクリックすることで、下のような画面が出てきてスライドサイズを設定できます。これを上のコードで実行したことになります。
もし、アメリカやイギリス生活が長いのでインチを使いたい!という場合は以下のように、Inchesをインポートします。
from pptx.utli import Inches
(省略)
ppt.slide_width = Inches(13.3)
ppt.slide_height = Inches(7.50)
(省略)
ポイントを使いたい場合は、Ptをインポートして使用してください。
from pptx.utli import Pt
(省略)
その他、違う単位を使いたい場合は、こちらで調べて下さい。
※今回のように、スライドの大きさをPythonで設定すると、プレースホルダーの位置が中央でなくなってしまいます。
スライドの設定
12行目では、Presentationオブジェクトのslide_layoutでスライドのレイアウトを選択しています。
独自のレイアウトを作成することもできますが、ここでは、パワーポイントのデフォルトのスタイルを使用しています。
slide_layoutのインデックスを変えることで、スライドのスタイルを変更することが出来ます。対応するインデックスとスタイルは下図の通りです。今回はslide_layout[0]と指定しているので、「タイトル スライド」を選択しています。
15行目で、Presentationオブジェクトのadd_slideメソッドで、プレゼンテーションにスライドを追加してSlideオブジェクトを作成しています。引数(カッコの中)には、先ほど選択したスライドレイアウトを指定します。
プレースホルダーの設定
16行目では、スライドのプレースホルダーを選択しています。今回の場合、スライド中にはプレースホルダーは2個存在しています(下図)。placeholders[0]としてリストのようにプレスーホルダーを選択します。
17, 18行目ではプレースホルダーのwidth、lengthで横幅、縦幅を設定しています。
19行目でplaceholders[0]のプレースホルダー(タイトルを入力の箇所)にテキストを入力しています。
20行目、21行目でplaceholders[1](サブタイトルを入力の箇所)を選択し、テキストを入力しています。
PythonでPowerpointを自動化:新しいスライドを追加
先ほど作成したPowerPointドキュメントに新規スライドを追加したいと思います。
今回は、白紙のスライドを追加し、スライドにテキストボックスを追加してテキストを書き込みます。
ソースコードと作成されるスライド
まず、ソースコードを見ていきましょう。上のソースコードのppt.saveの前に、以下のソースコードを足します
(省略)
slide_layout_6 = ppt.slide_layouts[6]
slide_6 = ppt.slides.add_slide(slide_layout_6)
shapes = slide_6.shapes
shape = shapes.add_textbox(Cm(10), 0, Cm(10), Cm(6))
# Shate.textを使用
shape.text = "Shape.text here document: paragraph0"
#ヒアドキュメント
shape.text += '''
Shape.text here document:paragraph1
Shapte.text here document:parapgrah2
Shapte.text here document:paragraph3'''
#_Paragraph.textを使って、パラグラフを足していく
text_frame = shape.text_frame # 枠
new_text = text_frame.add_paragraph()
new_text.text = "_Paragraph: paragraph4"
#Paragraphの数を確認
num_paragraphs = len(text_frame.paragraphs)
#_Runを使ってパラグラフを足す
new_paragraph = text_frame.add_paragraph()
new_run = new_paragraph.add_run()
new_run.text = "_Run: paragraph5"
(省略)
上のコードを加えると、以下のような新規スライドが追加されます。
テキストテキストボックスの追加
2行目~3行目では、slide_layout[6]と指定して白紙のスライドを選択し、白紙スライドを追加しています。
4行目で、SlideオブジェクトのshapesメソッドでSlideShapesオブジェクトを作成しています。変数shapesには、SlideShapesオブジェクトが入ります。
PowerPointの各スライドに配置する、テキストボックスや図形、グラフなどのアイテムは全て「Shape」と呼ばれているそうです。
SlideShapesオブジェクトを介して、テキストボックス図形などの様々なShapeを追加していきます。アクセスします。
テキストボックスを追加する為には、5行目にあるように、add_textboxメソッドを用います。add_textboxの引数には、left(横位置), top(縦位置) , width(幅), height(高さ)を渡します。
add_textboxメソッドを実行すると、Shapeオブジェクトが返されます。
add_textboxで行っていることは、PowerPointのテキスト枠を右クリックして、図形の書式設定を選択して、位置やサイズを指定している操作です。
テキストの挿入
今回は、テキストの挿入は3通りのパターンで書いてみました。
Shape.textを使う
8行目では、Shapeオブジェクトのtextメソッドを使い、テキストを挿入しています。おそらく一番シンプルな方法かと思います。
テキストの挿入方法は、”shape.text =” に文字列を渡すだけです。11行目から14行目に書かれているように、ヒアドキュメントも使えます。
_Paragraph.textを使う
17行目でShapeオブジェクトのtext_frameメソッドを使って、TextFrameオブジェクトを生成しています。TextFrameオブジェクトはテキスト枠を扱うオブジェクトです。
18行目でTextFrameオブジェクトのadd_paragraphメソッド使用して、テキスト枠内に段落を表す、_Paragraphオブジェクトを生成します。new_paragraphには_Paragraphオブジェクトがセットされます。
19行目で、_Paragraphオブジェクトのtextメソッドを使い、テキストの挿入を行っています。
確認の為、22行目では、paragraphsメソッドで、パラグラフの数を表示しています。パラグラフ数は5となっているはずです。
_Run.textを使う
25行目では、先ほどと同じように、add_paragraphメソッドを使用して、_Paragraphオブジェクトを生成します。
26行目で、_Paragraphオブジェクトのadd_runメソッドで、_Runオブジェクトを生成しています。_Runオブジェクトはテキストを扱う為のオブジェクトです。
27行目で、_Runオブジェクトのtextメソッドを用いて、テキストを挿入しています。
テキストを書くだけなら、Runオブジェクトを呼び出す必要はありません。しかし、フォントの色や大きさを変更したいときは、この_Runオブジェクトが必要になります。
テキストの色やフォントの変更方法は、次回に書きたいと思います。
PythonでPowerpointを自動化:Python-pptxを更に使いこなすためには?
Python-pptxを使ったPowerPointドキュメントの作成方法を簡単に説明しました。
今後は、テキストの装飾や図の貼り付け等も紹介していく予定ですが、「Python-pptxをもっとつかいこなしたい!」と思う方は、公式ドキュメントを読んでみた方が良いでしょう。
例えば、Presentationオブジェクトでどのような操作ができるようになるか?と知りたくなったら、Python-pptxのAPIドキュメントのPresentationオブジェクトのページを調べましょう。
APIドキュメントは最初は見方が良くわからないかもしれないですが、上のソースコードと照らし合わせたり、実際に試してみたりして、少しずつ慣れて行って下さい。面倒なパワポ作業を自動化して楽する為には、APIドキュメントを読むことは必須になります。
例えば、今回のようにパワーポイントを新規作成し、スライドを追加する場合を考えましょう。Presentationオブジェクトのページを見るとslidesというメソッドがあり、Slideオブジェクトが返されることが分かりますね。そこで、Slideオブジェクトの説明をチェックすると、add_slideメソッドがあり、”Return a newly added slide that inherits layout from slide_layout“と書いてあります。
説明文を読むと、add_slideを使えばスライドを追加できそうだとわかりますね(名前もそれっぽいし)。このような感じで、APIドキュメントを読んでいきます。