この記事で分かること
- Pythonプログラムでパワーポイントを自動で作成する方法が分かる
- Pythonプログラムでパワーポイントからデータを読み込む方法が分かる
PythonでPowerpoint(パワーポイント)を操作する概要
プレゼン資料などで使われるPowerpointですが、Powerpoint資料の文字列を読み取ってテキストマイニングしたい場合や、あるシステムの処理結果に従ってPowerpoint形式のファイルにアウトプットしたい場合には、パワーポイントをプログラムによって操作する必要があります。
この記事では、Pythonを使ったPowerpointファイルの作成方法と、Powerpointファイルからのデータ読み取る方法を説明します。
PythonでPowerpoint(パワーポイント)を操作する前提環境
Powerpoint(パワーポイント)を操作する前提の環境は、下の記事で説明している私の環境と同じ環境で確認しています。
レンタルサーバなどのLinuxサーバを使っている場合は、下の記事でプログラミングする環境の作り方を説明しています。もし、まだプログラムする環境ができていない方は、先にこちらの記事を読んで、プログラミングできる環境をつくることをおすすめします。
PythonでPowerpoint(パワーポイント)を操作するサンプルプログラム
ここでは、Powerpointの操作を行うサンプルプログラムを作成します。サンプルプログラムは次の3つのステップで構成することにします。
- (ステップ1)パワーポイントを操作する為のライブラリのインポート
- (ステップ2)パワーポイントファイルを作成する一連の処理
- (ステップ3)パワーポイントファイルのデータを読み込む一連の処理
(ステップ1)パワーポイントを操作する為のライブラリのインポート
ここでは、パワーポイント操作するためのライブラリを読み込みます。
import pptx
from pptx.util import Pt, Inches
from pptx.dml.color import RGBColor
- ライブラリ「pptx」をインポートする。
- ライブラリ「pptx.util」からモジュール「Pt」と「Inches」をインポートする。
- ライブラリ「pptx.dml.color」からモジュール「RGBColor」をインポートする。
(ステップ2)パワーポイントファイルを作成する一連の処理
ここでは、パワーポイントのファイルをPythonで作成する手順を説明します。次の挙げるそれぞれの手順の関数を定義します。
- パワーポイントのオブジェクトを作成する関数の定義
- スライドのレイアウトを取得する関数の定義
- スライドを追加する関数の定義
- スライドのタイトルを設定する関数の定義
- テキストボックスを追加する関数の定義
- 表を追加する関数の定義
- パワーポイントのファイルを保存する関数の定義
- 定義した関数の実行
1.パワーポイントのオブジェクトを作成する関数の定義
はじめに、パワーポイントのオブジェクトを作成する関数「get_presentation_obj」を定義します。
処理としては、pptx.Presentation()でプレゼンテーションオブジェクトを作成し、作成したプレゼンテーションオブジェクトを返却する処理になります。
# get presentation object
def get_presentation_obj(file=None):
prs = pptx.Presentation(file)
return prs
- 関数「get_presentation_obj」を定義宣言する。
- 変数「prs 」をライブラリ「pptx」の関数「Presentation」から得られるオブジェクトで初期化する。
- 変数「prs 」を戻り値として返却する。
2.スライドのレイアウトを取得する関数の定義
ここでは、スライドのレイアウトを取得する関数「get_slide_layout」を定義します。
引数には、プレゼンテーションオブジェクト(presentation_obj)とレイアウト番号(layout_num)を入力し、レイアウトオブジェクトを返却します。
※このレイアウトオブジェクトは以降で説明するスライドを追加する際に必要になります。
# get slide layout
def get_slide_layout(presentation_obj,layout_num):
title_slide_layout = presentation_obj.slide_layouts[layout_num]
return title_slide_layout
- 関数「get_slide_layout」を定義宣言する。
- 引数で得られたオブジェクト「presentation_obj」のメンバ変数「slide_layouts」の戻り値で変数「title_slide_layout 」を初期化する。
- 変数「title_slide_layout 」を戻り値として返却する。
3.スライドを追加する関数の定義
ここでは、スライドを追加する関数「add_slide」を定義します。引数にはプレゼンテーションオブジェクト(presentation_obj)とレイアウトオブジェクト(layout)を入力し、指定されたレイアウトのスライドオブジェクトを返却します。
# add slide to presentation
def add_slide(presentation_obj,layout):
slide = presentation_obj.slides.add_slide(layout)
return slide
- 関数「add_slide」を定義宣言する。
- 引数で得られたオブジェクト「presentation_obj」の関数「add_slide」の戻り値で変数「slide」を初期化する。
- 変数「slide」を戻り値として返却する。
4.スライドのタイトルを設定する関数の定義
ここでは、スライドのタイトルを設定する関数「set_title_text」を定義します。引数にはスライドオブジェクト(slide)とタイトル文字列(text)を入力し、スライドにタイトルを設定します。
# set title text
def set_title_text(slide,text):
slide.shapes.title.text = text
- 「set_title_text」を定義宣言する。
- 引数で得られたスライドオブジェクト「slide」のメンバ変数「shapes.title.text」に、引数で得られた「text」の値を代入する。
5.テキストボックスを追加する関数の定義
ここでは、テキストボックスを追加する関数「add_text_box」を定義します。引数には、下記の8つの引数を取得し、1つ目の引数のスライドオブジェクトに対して、テキストボックスを追加します。
- スライドオブジェクト(slide)
- 入力したいテキスト(text_contents)
- テキストボックスの左位置(left)
- テキストボックスの上位置(top)
- テキストボックスの幅(width)
- テキストボックスの高さ(height)
- 文字の大きさ(font_size)
- テキストボックスの塗りつぶし色(color)
# add text box
def add_text_box(slide,text_contents,left,top,width,height,font_size,color):
text_left = Inches(left/2.54)
text_top = Inches(top/2.54)
text_width = Inches(width/2.54)
text_height = Inches(height/2.54)
text_box = slide.shapes.add_textbox(text_left, text_top, text_width, text_height)
text_box.text = text_contents
text_box.text_frame.paragraphs[0].font.size = Inches(font_size/2.54)
text_box.fill.solid()
text_box.fill.fore_color.rgb = color
- 関数「add_text_box」を定義宣言する。
- 変数「left」をインチに変換した値で変数「text_left」を 初期化する。
- 変数「top」をインチに変換した値で変数「text_top」 を初期化する。
- 変数「width」をインチに変換した値で変数「text_width」を初期化する。
- 変数「height」をインチに変換した値で変数「text_height」を初期化する。
- 変数「text_box」を関数「slide.shapes.add_textbox」の呼び出しでテキストボックスを追加する。
- 変数「text_contents」の値で変数「text_box.text」を初期化する。
- 変数「font_size」をインチに変換した値で変数「text_box.text_frame.paragraphs[0].font.size」を初期化する。
- 関数「text_box.fill.solid」を呼び出して、テキストボックスを塗りつぶす。
- 変数「text_box.fill.fore_color.rgb」を変数「color」の値で初期化する。
6.表を追加する関数の定義
ここでは、表を追加する関数「add_table」を定義します。引数には、下記の7つの引数を取得し、1つ目の引数のスライドに対して、表を追加します。
- スライドオブジェクト(slide)
- 表のデータ(table_data)
- 表の左位置(left)
- 表の上位置(top)
- 表の幅(width)
- 表の高さ(height)
- 文字のサイズ(font_size)
# add table
def add_table(slide,table_data,left,top,width,height,font_size):
rows = len(table_data)
cols = len(table_data[0])
table_left = Inches(left/2.54)
table_top = Inches(top/2.54)
table_width = Inches(width/2.54)
table_height = Inches(height/2.54)
table = slide.shapes.add_table(rows, cols, table_left, table_top, table_width, table_height).table
for i in range(rows):
for j in range(cols):
cell = table.cell(i, j)
cell.text = table_data[i][j]
cell.text_frame.paragraphs[0].font.size = Inches(font_size/2.54)
- 関数「add_table」を定義宣言する。
- 変数「rows」を引数で得られる変数「table_data」の長さで初期化する。
- 変数「cols」を 引数で得られる変数「table_data」の0番目のデータ長で初期化する。
- 変数「table_left」を変数「left」をインチに変換した値で初期化する。
- 変数「table_top」を 変数「top」をインチに変換した値で初期化する。
- 変数「table_width」を変数「width」をインチに変換した値で初期化する。
- 変数「table_height」を変数「height」をインチに変換した値で初期化する。
- 変数「rows」、「cols」、「table_left」、「table_top」、「table_width」、「table_height」を引数に指定して、関数「slide.shapes.add_table」から返却されるオブジェクトのメンバ変数「table」で変数「table」を初期化する。
- 変数「rows」を1つずつ変数「i」に代入しながら以下の処理を繰り返す。
- 変数「cols」を1つずつ変数「j」に代入しながら以下の処理を繰り返す。
- 変数「i」番目の列と変数「j」番目の行のセルオブジェクトで変数「cell」を初期化する。
- 変数「cell」のメンバ変数「text」に、変数「i」番目の列と変数「j」番目の行の「table_data」の値を代入する。
- オブジェクト「cell.text_frame.paragraphs」の0番目のメンバ変数「font.size」 変数「font_size」をインチに変換した値で初期化する。
- 変数「cols」を1つずつ変数「j」に代入しながら以下の処理を繰り返す。
7.パワーポイントのファイルを保存する関数の定義
ここでは、パワーポイントのファイルを保存する関数「save_presentation」を定義します。引数にはfile_name(ファイル名)を取り、指定されたファイル名でパワーポイントを保存できるようにしています。
# save presentation file
def save_presentation(file_name):
prs_obj.save(file_name)
- 「save_presentation」を定義宣言する。
- 引数で得られた変数「file_name」を引数に指定してオブジェクト「prs_obj」の関数「save」を呼び出す。
8.定義した関数の実行
ここでは、上記に定義した関数を使って、パワーポイントファイルを作成するプログラムを記載します。スライドは全部で3ページで、「test.pptx」という名前のファイルを作成します。2スライド目には色が異なるテキストボックスを3つ作成し、それぞれに異なるテキストを入力しています。3スライド目には、「AAA」から「III」までの文字が書かれた3行3列の表を挿入しています。
if __name__ == '__main__':
prs_obj = get_presentation_obj()
#---1 page---
# set slide layout
title_slide_layout = get_slide_layout(presentation_obj=prs_obj,layout_num=1)
# add slide
added_slide1 = add_slide(presentation_obj=prs_obj,layout=title_slide_layout)
# set title text
set_title_text(slide=added_slide1,text="This is title text!")
#---2 page---
# set slide layout
title_slide_layout = get_slide_layout(presentation_obj=prs_obj,layout_num=1)
# add slide
added_slide2 = add_slide(presentation_obj=prs_obj,layout=title_slide_layout)
# set title text
set_title_text(slide=added_slide2,text="This is title text!")
# add text box
color = RGBColor(100, 255, 255)
add_text_box(
slide=added_slide2,
text_contents="Add text box1",
left=2,
top=5,
width=21,
height=3,
font_size=1,
color=color)
# add text box
color = RGBColor(255, 100, 255)
add_text_box(
slide=added_slide2,
text_contents="Add text box2",
left=2,
top=9,
width=21,
height=3,
font_size=2,
color=color)
# add text box
color = RGBColor(255, 255, 100)
add_text_box(
slide=added_slide2,
text_contents="Add text box3",
left=2,
top=13,
width=21,
height=3,
font_size=3,
color=color)
#---3 page---
# set slide layout
title_slide_layout = get_slide_layout(presentation_obj=prs_obj,layout_num=1)
# add slide
added_slide3 = add_slide(presentation_obj=prs_obj,layout=title_slide_layout)
# set title text
set_title_text(slide=added_slide3,text="This is title text!")
data = [ ["AAA","BBB","CCC"]
,["DDD","EEE","FFF"]
,["GGG","HHH","III"]]
# add table
add_table(
slide=added_slide3,
table_data=data,
left=2,
top=9,
width=21,
height=5,
font_size=1)
# Save powerpoint file
save_presentation(file_name='test.pptx')
- 変数「prs_obj」を 関数「get_presentation_obj」から返却されるプレゼンテーションオブジェクトで初期化する。
- 変数「title_slide_layout」を関数「get_slide_layout」の戻り値で初期化する。
- 変数「added_slide1」を関数「add_slide」の戻り値で初期化する。
- 関数「set_title_text」を呼び出す。
- 関数「set_title_text」を呼び出す。
- 変数「color」 を関数「RGBColor」から返却されるカラーオブジェクトで初期化する。
- 関数「add_text_box」を呼び出す。
- 変数「title_slide_layout」を関数「get_slide_layout」の戻り値で初期化する。
- 変数「added_slide3」を関数「add_slide」の戻り値で初期化する。
- 関数「set_title_text」を呼び出す。
- 変数「data 」を初期化する。
- 関数「add_table」を呼び出す。
- 関数「save_presentation」を呼び出す。
(ステップ3)パワーポイントファイルのデータを読み込む一連の処理
次に、パワーポイントファイルに記載されているテキストデータを読み取る方法を説明します。パワーポイントの読み取りでは、次の挙げるそれぞれの手順の関数を定義します。
- テキストボックスの文字列を読み取る関数の定義
- 表(テーブル)の文字列を読み取る関数の定義
- スライドオブジェクトを取得する関数の定義
- 定義した関数の実行
1.パワーポイントのテキストボックスの文字列を読み取る関数の定義
ここでは、パワーポイントのテキストボックスの文字列を読み取る関数「read_text_box」を定義します。引数にslide(スライドオブジェクト)を取り、テキストボックスの文字列を配列extracted_textで返却する関数になります。
# read text box
def read_text_box(slide):
extracted_text = []
for shape in slide.shapes:
if shape.has_text_frame:
extracted_text.append(shape.text)
return extracted_text
- 関数「read_text_box」を定義宣言する。
- 変数「extracted_text」を空のリストで初期化する。
- スライドオブジェクトのメンバ変数「slide.shapes」を変数「shape」に格納しながら次の処理を繰り返す。
- 変数「shape.has_text_frame」がTRUEだった場合は次の処理を実行する。
- 変数「extracted_text」に「shape.text」を追加する。
- 変数「shape.has_text_frame」がTRUEだった場合は次の処理を実行する。
- 変数「extracted_text」を戻り値として返却する。
2.パワーポイントのテーブルの文字列を読み取る関数の定義
ここでは、パワーポイントの表(テーブル)の文字列を読み取る関数「read_table」を定義します。引数にtable(テーブルオブジェクト)を取り、テーブルから読み取った文字列w2次元の配列ret_arrayで返却するようにしています。
def read_table(table):
ret_array = []
for row in table.rows:
temp_array = []
for cell in row.cells:
temp_array.append(cell.text)
ret_array.append(temp_array)
return ret_array
- 関数「read_table」を定義宣言する。
- 変数「ret_array」を空のリストで初期化する。
- テーブルオブジェクト「table」のメンバ変数「rows」の値を1つずつ変数「row」に格納しながら次の処理を繰り返す。
- 変数「temp_array」を空のリストで初期化する。
- 変数「row」のメンバ変数「cells」を1つずつ変数「cell」に格納しながら次の処理を繰り返す。
- 変数「temp_array」に変数「cell.text」の値を追加する
- 変数「ret_array」に「temp_array」を追加する。
- 変数「ret_array」を戻り値として返却する。
3.パワーポイントのスライドオブジェクトを取得する関数の定義
ここでは、パワーポイントのスライドオブジェクトを取得する関数「get_slide_object」を定義します。引数に、presentation_obj(プレゼンテーションオブジェクト)とnum(スライド番号)を取り、スライド番号に対応するスライドオブジェクトを返却します。もし、スライド番号に負の値が入力されたり、存在しないスライド番号が入力された場合には、戻りに「None」を返却します。
# get slide object
def get_slide_object(presentation_obj,num):
if num < 0:
return None
elif len(presentation_obj.slides) > num:
return presentation_obj.slides[num]
else:
return None
- 関数「get_slide_object」を定義宣言する。
- 変数「num」の値が0よりも小さい場合は次の処理を実行する。
- Noneを戻り値として返却する。
- プレゼンテーションオブジェクト「presentation_obj」のメンバ「slides」のリストの長さが「num」よりも大きい場合は次の処理を実行する。
- プレゼンテーションオブジェクト「presentation_obj」の変数「num」の値番目の「slides」の値を戻り値として返却する。
- 上記以外の条件の場合には次の処理を実行する。
- Noneを戻り値として返却する。
4.定義した関数の実行
実際に上記で定義した関数の呼び出して、パワーポイントの読み取り処理を行います。また、読み取り対象のパワーポイントファイルは、上で作成した「test.pptx」を使用します。
if __name__ == '__main__':
# get presentation object
r_prs_obj = get_presentation_obj(file='test.pptx')
# text bpx reading
for page,slide in enumerate(r_prs_obj.slides,start=1):
print(page)
print(read_text_box(slide=slide))
# get slide object
target_slide = get_slide_object(presentation_obj=r_prs_obj,num=2)
# read table
for shape in target_slide.shapes:
if shape.has_table:
data = read_table(table=shape.table)
print(data)
- 変数「r_prs_obj」を関数「get_presentation_obj」からの戻り値で初期化する。
- 変数「r_prs_obj」の順番を「page」に、それぞれのスライドオブジェクト「slide」に格納する。
- 変数「page」の内容を表示する。
- 関数「read_text_box」からの戻り値を表示する。
- 変数「target_slide」を関数「get_slide_object」からの戻り値で初期化する。
- 変数「target_slide.shapes」を1つずつ「shape」に格納しながら次の処理を繰り返す。
- 変数「shape」のメンバ「has_table」がTRUEだった場合は次の処理を実行する。
- 変数「data」を関数「read_table」からの戻り値で初期化する。
- 変数「data」の内容を表示する。
Pythonで行うその他のofficeの操作方法
officeには、それぞれ異なる操作方法があります。
下記の記事では、普段の業務で使える、office(パワーポイント、エクセル、ワード)のPythonのプログラムによる操作方法を説明しています。
officeそれぞれの操作方法を、下記の記事を参考に、ご自身のプログラムを作成してみてください。
Pythonで業務効率化するその他の方法
この記事では、Pythonを使ったPowerpointファイルの作成方法と、Powerpointファイルからのデータ読み取る方法を説明しました。Powerpoint以外にもPythonには、業務効率化できる手段がたくさんあります。
下記の記事に、普段オフィス環境で使われるツールを使って業務効率化できる方法をまとめていますので、ぜひ合わせて読んで取り組んでみてください。