Python

【Python】Powerpoint(パワーポイント)を操作する【→業務効率UP】

7月 20, 2019

how to control powerpoint by python
プログラム女子
会社のPowerpoint資料の文字だけを取り出したいんだけど...
それなら、Pythonを使ってPowerpointの文字列を読み取ることができるよ。さらに、その文字列を使って別のPowerpoint資料を作ることもできるから、今日はその方法を紹介するね。
Tommy

この記事で分かること

  • Pythonプログラムでパワーポイントを自動で作成する方法が分かる
  • Pythonプログラムでパワーポイントからデータを読み込む方法が分かる

PythonでPowerpoint(パワーポイント)を操作する概要

summary of control powerpoint on python

プレゼン資料などで使われるPowerpointですが、Powerpoint資料の文字列を読み取ってテキストマイニングしたい場合や、あるシステムの処理結果に従ってPowerpoint形式のファイルにアウトプットしたい場合には、パワーポイントをプログラムによって操作する必要があります。

この記事では、Pythonを使ったPowerpointファイルの作成方法と、Powerpointファイルからのデータ読み取る方法を説明します。

PythonでPowerpoint(パワーポイント)を操作する前提環境

environment of control powerpoint on python

Powerpoint(パワーポイント)を操作する前提の環境は、下の記事で説明している私の環境と同じ環境で確認しています。

オススメ
how to check version in python
【Python】バージョン確認の方法【→プログラミング初心者向け】

続きを見る

レンタルサーバなどのLinuxサーバを使っている場合は、下の記事でプログラミングする環境の作り方を説明しています。もし、まだプログラムする環境ができていない方は、先にこちらの記事を読んで、プログラミングできる環境をつくることをおすすめします。

オススメ
how to programming on rental server
【Linux】レンタルサーバーでプログラミングする方法【→ブログのサーバーでできる!】

続きを見る

PythonでPowerpoint(パワーポイント)を操作するサンプルプログラム

sample program of control powerpoint on python

ここでは、Powerpointの操作を行うサンプルプログラムを作成します。サンプルプログラムは次の3つのステップで構成することにします。

  • (ステップ1)パワーポイントを操作する為のライブラリのインポート
  • (ステップ2)パワーポイントファイルを作成する一連の処理
  • (ステップ3)パワーポイントファイルのデータを読み込む一連の処理

(ステップ1)パワーポイントを操作する為のライブラリのインポート

ここでは、パワーポイント操作するためのライブラリを読み込みます。

import pptx
from pptx.util import Pt, Inches
from pptx.dml.color import RGBColor

  1. ライブラリ「pptx」をインポートする。
  2. ライブラリ「pptx.util」からモジュール「Pt」と「Inches」をインポートする。
  3. ライブラリ「pptx.dml.color」からモジュール「RGBColor」をインポートする。

(ステップ2)パワーポイントファイルを作成する一連の処理

ここでは、パワーポイントのファイルをPythonで作成する手順を説明します。次の挙げるそれぞれの手順の関数を定義します。

  1. パワーポイントのオブジェクトを作成する関数の定義
  2. スライドのレイアウトを取得する関数の定義
  3. スライドを追加する関数の定義
  4. スライドのタイトルを設定する関数の定義
  5. テキストボックスを追加する関数の定義
  6. 表を追加する関数の定義
  7. パワーポイントのファイルを保存する関数の定義
  8. 定義した関数の実行

1.パワーポイントのオブジェクトを作成する関数の定義

はじめに、パワーポイントのオブジェクトを作成する関数「get_presentation_obj」を定義します。

処理としては、pptx.Presentation()でプレゼンテーションオブジェクトを作成し、作成したプレゼンテーションオブジェクトを返却する処理になります。

# get presentation object
def get_presentation_obj(file=None):

	prs = pptx.Presentation(file)
	return prs

  1. 関数「get_presentation_obj」を定義宣言する。
  2. 変数「prs 」をライブラリ「pptx」の関数「Presentation」から得られるオブジェクトで初期化する。
  3. 変数「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

  1. 関数「get_slide_layout」を定義宣言する。
  2. 引数で得られたオブジェクト「presentation_obj」のメンバ変数「slide_layouts」の戻り値で変数「title_slide_layout 」を初期化する。
  3. 変数「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

  1. 関数「add_slide」を定義宣言する。
  2. 引数で得られたオブジェクト「presentation_obj」の関数「add_slide」の戻り値で変数「slide」を初期化する。
  3. 変数「slide」を戻り値として返却する。

4.スライドのタイトルを設定する関数の定義

ここでは、スライドのタイトルを設定する関数「set_title_text」を定義します。引数にはスライドオブジェクト(slide)とタイトル文字列(text)を入力し、スライドにタイトルを設定します。

# set title text
def set_title_text(slide,text):

	slide.shapes.title.text = text

  1. 「set_title_text」を定義宣言する。
  2. 引数で得られたスライドオブジェクト「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

  1. 関数「add_text_box」を定義宣言する。
  2. 変数「left」をインチに変換した値で変数「text_left」を 初期化する。
  3. 変数「top」をインチに変換した値で変数「text_top」 を初期化する。
  4. 変数「width」をインチに変換した値で変数「text_width」を初期化する。
  5. 変数「height」をインチに変換した値で変数「text_height」を初期化する。
  6. 変数「text_box」を関数「slide.shapes.add_textbox」の呼び出しでテキストボックスを追加する。
  7. 変数「text_contents」の値で変数「text_box.text」を初期化する。
  8. 変数「font_size」をインチに変換した値で変数「text_box.text_frame.paragraphs[0].font.size」を初期化する。
  9. 関数「text_box.fill.solid」を呼び出して、テキストボックスを塗りつぶす。
  10. 変数「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)

  1. 関数「add_table」を定義宣言する。
  2. 変数「rows」を引数で得られる変数「table_data」の長さで初期化する。
  3. 変数「cols」を 引数で得られる変数「table_data」の0番目のデータ長で初期化する。
  4. 変数「table_left」を変数「left」をインチに変換した値で初期化する。
  5. 変数「table_top」を 変数「top」をインチに変換した値で初期化する。
  6. 変数「table_width」を変数「width」をインチに変換した値で初期化する。
  7. 変数「table_height」を変数「height」をインチに変換した値で初期化する。
  8. 変数「rows」、「cols」、「table_left」、「table_top」、「table_width」、「table_height」を引数に指定して、関数「slide.shapes.add_table」から返却されるオブジェクトのメンバ変数「table」で変数「table」を初期化する。
  9. 変数「rows」を1つずつ変数「i」に代入しながら以下の処理を繰り返す。
    1. 変数「cols」を1つずつ変数「j」に代入しながら以下の処理を繰り返す。
      1. 変数「i」番目の列と変数「j」番目の行のセルオブジェクトで変数「cell」を初期化する。
      2. 変数「cell」のメンバ変数「text」に、変数「i」番目の列と変数「j」番目の行の「table_data」の値を代入する。
      3. オブジェクト「cell.text_frame.paragraphs」の0番目のメンバ変数「font.size」 変数「font_size」をインチに変換した値で初期化する。

7.パワーポイントのファイルを保存する関数の定義

ここでは、パワーポイントのファイルを保存する関数「save_presentation」を定義します。引数にはfile_name(ファイル名)を取り、指定されたファイル名でパワーポイントを保存できるようにしています。

# save presentation file
def save_presentation(file_name):

	prs_obj.save(file_name)

  1. 「save_presentation」を定義宣言する。
  2. 引数で得られた変数「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')

  1. 変数「prs_obj」を 関数「get_presentation_obj」から返却されるプレゼンテーションオブジェクトで初期化する。
  2. 変数「title_slide_layout」を関数「get_slide_layout」の戻り値で初期化する。
  3. 変数「added_slide1」を関数「add_slide」の戻り値で初期化する。
  4. 関数「set_title_text」を呼び出す。
  5. 関数「set_title_text」を呼び出す。
  6. 変数「color」 を関数「RGBColor」から返却されるカラーオブジェクトで初期化する。
  7. 関数「add_text_box」を呼び出す。
  8. 変数「title_slide_layout」を関数「get_slide_layout」の戻り値で初期化する。
  9. 変数「added_slide3」を関数「add_slide」の戻り値で初期化する。
  10. 関数「set_title_text」を呼び出す。
  11. 変数「data 」を初期化する。
  12. 関数「add_table」を呼び出す。
  13. 関数「save_presentation」を呼び出す。

(ステップ3)パワーポイントファイルのデータを読み込む一連の処理

次に、パワーポイントファイルに記載されているテキストデータを読み取る方法を説明します。パワーポイントの読み取りでは、次の挙げるそれぞれの手順の関数を定義します。

  1. テキストボックスの文字列を読み取る関数の定義
  2. 表(テーブル)の文字列を読み取る関数の定義
  3. スライドオブジェクトを取得する関数の定義
  4. 定義した関数の実行

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

  1. 関数「read_text_box」を定義宣言する。
  2. 変数「extracted_text」を空のリストで初期化する。
  3. スライドオブジェクトのメンバ変数「slide.shapes」を変数「shape」に格納しながら次の処理を繰り返す。
    1. 変数「shape.has_text_frame」がTRUEだった場合は次の処理を実行する。
      1. 変数「extracted_text」に「shape.text」を追加する。
  4. 変数「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

  1. 関数「read_table」を定義宣言する。
  2. 変数「ret_array」を空のリストで初期化する。
  3. テーブルオブジェクト「table」のメンバ変数「rows」の値を1つずつ変数「row」に格納しながら次の処理を繰り返す。
    1. 変数「temp_array」を空のリストで初期化する。
    2. 変数「row」のメンバ変数「cells」を1つずつ変数「cell」に格納しながら次の処理を繰り返す。
      1. 変数「temp_array」に変数「cell.text」の値を追加する
    3. 変数「ret_array」に「temp_array」を追加する。
  4. 変数「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

  1. 関数「get_slide_object」を定義宣言する。
  2. 変数「num」の値が0よりも小さい場合は次の処理を実行する。
    1. Noneを戻り値として返却する。
  3. プレゼンテーションオブジェクト「presentation_obj」のメンバ「slides」のリストの長さが「num」よりも大きい場合は次の処理を実行する。
    1. プレゼンテーションオブジェクト「presentation_obj」の変数「num」の値番目の「slides」の値を戻り値として返却する。
  4. 上記以外の条件の場合には次の処理を実行する。
    1. 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)

  1. 変数「r_prs_obj」を関数「get_presentation_obj」からの戻り値で初期化する。
  2. 変数「r_prs_obj」の順番を「page」に、それぞれのスライドオブジェクト「slide」に格納する。
  3. 変数「page」の内容を表示する。
  4. 関数「read_text_box」からの戻り値を表示する。
  5. 変数「target_slide」を関数「get_slide_object」からの戻り値で初期化する。
  6. 変数「target_slide.shapes」を1つずつ「shape」に格納しながら次の処理を繰り返す。
    1. 変数「shape」のメンバ「has_table」がTRUEだった場合は次の処理を実行する。
    2. 変数「data」を関数「read_table」からの戻り値で初期化する。
  7. 変数「data」の内容を表示する。

Pythonで行うその他のofficeの操作方法

how to control other office file on python

officeには、それぞれ異なる操作方法があります。

下記の記事では、普段の業務で使える、office(パワーポイント、エクセル、ワード)のPythonのプログラムによる操作方法を説明しています。

officeそれぞれの操作方法を、下記の記事を参考に、ご自身のプログラムを作成してみてください。

オススメ
how to control 3 office software by python
【Python】オフィス3つの操作方法【→業務効率UP】

続きを見る

Pythonで業務効率化するその他の方法

other way of business efficiency by python

この記事では、Pythonを使ったPowerpointファイルの作成方法と、Powerpointファイルからのデータ読み取る方法を説明しました。Powerpoint以外にもPythonには、業務効率化できる手段がたくさんあります。

下記の記事に、普段オフィス環境で使われるツールを使って業務効率化できる方法をまとめていますので、ぜひ合わせて読んで取り組んでみてください。

オススメ
8 ways for business efficiency by python
【Python】業務効率化の方法8選【→周りを出し抜く自動化】

続きを見る

-Python
-