【PythonでPowerPointを操る】python-pptxでテーブル(表)を作成する方法

スポンサーリンク
Python外部ライブラリ(python-pptx)テーブル表 Python

今回も引き続き、Pythonから「PowerPoint」を操作する機能を供する「python-pptx」ライブラリを紹介していきます。

連載の目次は、以下のようになっていますので参考になさってください。

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

さて、前回の記事ではグラフの作成手順について解説しましたが、グラフに続いて検討したいこととして思いつくのはスライドに「表(テーブル)」を挿入することではないでしょうか?

グラフで大まかな傾向を掴んだあとは、そのもととなるデータソースを併載することで資料の信ぴょう性や確度が高まり、より相手を納得させることができるでしょう。

表(テーブル)もまたExcelが得意とする機能ですので、一度Excelでつくった表をスライドに貼り付けて資料を作っていく手順が王道だと思います。

しかし、前回取り上げたようにグラフの作成がPythonで完結できるわけですから、表もExcelを使うことなく作成したくなりますよね。

また、月次の売上報告のようにある程度資料の雛形ができていて表の数値を入れ替えるような場合は、わざわざExcelを経由することなく直接PowerPoinを操作してしまったほうが早いですし自動化もしやすくなると思います

そこで、連載4回目となる今回はpython-pptxを使ってPowerPointだけで表を作成する 方法を紹介します。

この記事を読むことで次のことが分かるようなります。

この記事で学べること
  • PowerPointにテーブル(表)を挿入する手順を図解で解説する。
  • テーブル(Tableオブジェクト)の階層構造や関連属性ついて整理する。
  • セル(Cellオブジェクト)の書式設定を施す方法が分かる。

それでは、次節より各オブジェクトの詳細について解説をしていきます。

なお、本記事内で紹介する各種クラスや関数などの使い方は一例です。省略可能なオプション引数などについては割愛していますので、詳細や不明点などは必要に応じて下記「公式ドキュメント」を参照してください。

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

https://openpyxl.readthedocs.io/en/stable/
スポンサーリンク

1. スライドにテーブル・表(Tableオブジェクト)を貼る

本節では、スライドにテーブル(表)を挿入する手順の概要と、Tableオブジェクトの構成要素について、さらにその関連属性について解説をしていきます。

1.1 スライドの構成要素とテーブルの関係

PowerPointは図1のように、プレースフォルダ(TITLE, BODY、、等)、図形(AutoShape)、グラフテーブル(表) などといったさまざまな要素によって構成されています。

Python_PowerPointの構成要素_rev0.2
図1 PowerPointを構成する要素(再掲)

これら、一つ一つの要素は「python-pptx」ではShapeオブジェクトとして管理しています。本記事のメインテーマである、テーブル()表もまた、Shapeオブジェクトの一種として扱われます。(図2)

Python_Shapeオブジェクトの種類_rev0.1
図2 python-pptxのオブジェクト階層図とShapeオブジェクト

それでは、次項よりテーブル(表)のShapeオブジェクトに関連するオブジェクトやメソッド・プロパティについて解説していきます。

1.2 テーブル(表)のShapeオブジェクトを追加する

本項では「python-pptx」でPowerPointにテーブル(表)を挿入する手順の概要を解説します。

テーブルの挿入手順は図3のとおりです。(以降の説明の➀~➂は図3の番号に対応しています。)

Python_Tableオブジェクトの使い方(概要)
図3 テーブル(表)を挿入する手順の概要

add_table()メソッドの引数にテーブルの大きさや配置位置を指定してShapeオブジェクト(テーブル)を取得します。次にで、ShapeオブジェクトからtableプロパティにてTableオブジェクトを取得します。

実は、で取得したShapeオブジェクトの実体は、GraphicFrameオブジェクトと呼ばれる、グラフやテーブル、SmartArtを管理するコンテナとなります。よっとでさらにTableオブジェクトを取得し配下の属性でグラフを作成します。

このTableオブジェクトはさらに、行、列、セルの単位(それぞれColumns,Rows,Cellsオブジェクト)に分解できます。それぞれの配下のさまざまなメソッド・プロパティでセルの値、色、幅、高さなど

の詳細を設定できるようになります。


さらに、Columns,Rows,Cellsオブジェクトについてもう少し深堀りします。

図4は各種オブジェクトの構成イメージを示しています。(以降の説明の~は図4の番号に対応しています。)

Tableを構成する各種オブジェクトの関係
図4 テーブル(表)を構成する各種オブジェクト

テーブル全体を指し示すはTableオブジェクトです。その次のレイヤとしてColumnsオブジェクトRowsオブジェクトがあります。それぞれは、列、行に対応しする要素を持つイテラブルなオブジェクトになります。

Coloumns/Rowsオブジェクトは、For文や[インデックス]表記によりシーケンシャルにまたは個別に、各、行(Row)・列(Column)にアクセスすることができます(➃➄)。(“s”が付かないので注意)

また、個々のセルはCellオブジェクトであり、テーブルは元より、行、列を構成する最小単位となり

ます。(➅)

ColumnやRowオブジェクト、ひいてはTableオブジェクトはCellオブジェクトの集合体となります。(図5)

Table_col,Rowとcellオブジェクトの関係
図5 Column, Row, Cellオブジェクトの構成要素

各Cellオブジェクトには、インデックスが割り振られており、基準となる“A1”セルを”(0, 0)”として各セルにアクセスします。

では、それぞれについてのオブジェクトに関連するメソッド・プロパティの解説をします。

1.3 テーブルを構成するオブジェクトの取得と設定

先にも説明したようにテーブルを作成するにはShapeオブジェクト(テーブル)をはじめとする、おおくの関連オブジェクトや属性が関わります。本項ではそれらの中から必須のオブジェクト・属性についてピックアップ。仕様にまとめます。

1.3.1 shapesコレクションに要素(テーブル)を追加する

新たにテーブルを追加する場合には、テーブル用のShapeオブジェクトを追加・取得する必要があります。python-pptxでは、add_table()メソッド」を次の書式にように使うことで対応できます。

Shapeオブジェクト(テーブル)の取得

Shapesコレクション.add_table(rows, cols, left, top, width, height )メソッド


引数: rows: 追加する表の行数を設定する

引数: cols: 追加する表の列数を設定する

引数: left: テーブル左上のX座標

引数: top: テーブル左上のY座標

引数: width: テーブルの幅

引数: height: テーブルの高さ

戻り値: Shapeオブジェクト(※) / Shapesコレクションに追加する

1.3.2 Tableオブジェクトを取得する

<1.2項>で少し補足しましたが、add_table()メソッドで取得したテーブルのShapeオブジェクトの実体は、GraphicFrameオブジェクトと呼ばれる、グラフやテーブル、SmartArtを管理するコンテナとなります。

よって、テーブルの操作をするには、さらにGraphicFrameオブジェクトから、Tableオブジェクトを取り出す必要があり、そのための属性がtableプロパティになります。

Tableオブジェクトの取得

Shapeオブジェクト.tableプロパティ


戻り値:Tableオブジェクト

1.3.3 Column/Rowオブジェクトの取得

テーブルを行・列の単位で管理するのがRows/Columnsオブジェクトになります。

これらは、個別の行・列をまとめたイテラブルなオブジェクト(コレクション)です。次の書式のようにインデックスを指定して所望の行・もしくは列のオブジェクト

(Row/Column(※”s”が付かないことに注意)にアクセスします。

Column/Rowオブジェクトの取得

Tableオブジェクト.columns[index]プロパティ

引数:[index]:特定のColumnオブジェクトを取得  1列目を“0”とする

(省略するとコレクションを取得)

戻り値:Columnオブジェクト


Tableオブジェクト.rows[index]プロパティ

引数:[index]:特定のRowオブジェクトを取得 1行目を“0”とする

(省略するとコレクションを取得)

戻り値:Rowオブジェクト

Columnオブジェクトには、列の幅を設定するwidthプロパティ、Rowオブジェクトには、行の高さを設定するheightプロパティが用意されています。

また、Row/Columnもイテラブルに要素であるCellオブジェクトへ分解することもできます。

1.3.4 Cellオブジェクトの取得と設定

テーブルを構成する最小単位であるCellオブジェクト。その取得にはいくつかのパターンが用意されています。

Cellオブジェクトの取得

Tableオブジェクト.iter_cells()メソッド

戻り値: Cellオブジェクト

(テーブルの左上のセルから右下のセルへ向けて順番に取得する)


Tableオブジェクト.cell(row_idx, col_idx)メソッド

引数: row_idx: テーブルの行番号 1行目は「0」で指定

引数: col_idx: テーブルの列番号 ”1”列目は「0」で指定

戻り値: Cellオブジェクト


Rowオブジェクト[index]

引数:index: その行の先頭(左端)からのオフセットを指定する

Coloumnオブジェクト[index]

引数:index: その列の先頭(上)からのオフセットを指定する

戻り値:Cellオブジェクト

Cellオブジェクトには様々がプロパティが用意され細かい設定を施すことができます。主要なものには、次のようなものがあります。

Cellオブジェクト.機能の説明
textプロパティセルに値を設定する
fillプロパティFillFormatオブジェクトを取得
FillFormatオブジェクトにより各種セルの塗り潰し効果の適用ができる
text_frameプロパティTextFrameオブジェクト】を取得
TextFrameオブジェクトにより段落や文字、書式の設定ができる
merge(other_cell)メソッド複数のセルを結合する
引数:other_cel: Cellオブジェクトの対向セルを指定する(結合セル範囲の)
split()メソッド結合セルを解除する
結合されていないセルに対して実行すると”ValueError”が発生する
vertical_anchorプロパティセルの垂直位置揃えの指定をする
MSO_VERTICAL_ANCHOR】TOP(上揃え)、MIDDLE(中央揃え)、BOTTOM(下揃え)
表1 Cellオブジェクト配下の属性

Cellオブジェクトには、「数値」「文字列」(textプロパティ)は設定できますが、「画像」「図形」は設定できません。また、段落(text_frameプロパティ)も設けることができます。

また、複数セルを一つのセルに結合(マージ)することも可能です。結合には、marge()メソッド、分割にはsplit()メソッドを次のような引数指定で使います。

Python_python-pptx_Table_セルの結合と分割
図 複数セルの結合(マージ)

以上が、テーブルの作成に関係するオブジェクトや属性の解説となります。

最後に、階層構造をまとめておきましょう。

Tableオブジェクトの階層構造
図6 Tableオブジェクトの階層構造

2. 【SAMPLEコード】スライドにテーブル(表)を挿入する実用例

Python_基本文法_内包表記

これまでに、解説してきたテーブル作成に関するオブジェクトと属性について、実際にどのような使われ方をしているのか実用例を確認ししてみましょう。

2.1 基本的なテーブルを作成する【SAMPLEコード➀】

はじめに、4行×4列のテーブルを挿入して、各セルに値を設定する作例を紹介します。

from pptx import Presentation
from pptx.util import Cm

prs = Presentation()
sld0 = prs.slides.add_slide(prs.slide_layouts[5])
sld0.shapes[0].text = '表を挿入する'

rows = 4		# 4行(表の行数)の指定
cols = 4		# 4列(表の列数)の指定

# shapeオブジェクト(表)を追加
# 引数に行数、列数、左上のX座標、左上のX座標、表の幅、表の高さ
table_shape = sld0.shapes.add_table(rows, cols,
                                   Cm(3), Cm(5), Cm(20), Cm(8))

table = table_shape.table	# Tableオブジェクトを作成

#----------------------------------------------------------------------------
# 列見出しのテキスト設定

category = ['カテゴリー1', 'カテゴリー2',  'カテゴリー3']

for i in range(len(category)):
    cell = table.cell(i+1, 0)	 # cellオブジェクトの取得
    cell.text = category[i]	   # textプロパティで値を設定する

#----------------------------------------------------------------------------
# 行見出しのテキスト設定

series = ['系列1', '系列2', '系列3']

for i in range(len(series)):
    cell = table.cell(0, i+1)	 # cellオブジェクトの取得
    cell.text = series[i]	     # textプロパティで値を設定する

#----------------------------------------------------------------------------
# その他セルに値を設定する

value1 = [[1, 2, 3],[4, 5, 6],[7, 8, 9]]

for i in range(len(value1)):
    for k in range(len(value1[i])):
        cell = table.cell(k+1, i+1)	   # cellオブジェクトの取得
        cell.text = str(value1[i][k])	 # textプロパティで値を設定する
    
prs.save('Blog_表の作成.pptx')

ポイントを解説します。

13~16行目:【Tableオブジェクトの取得】

まず、add_table()メソッドの引数にテーブルのスケール(4行×4列)と位置・サイズを指定して、Shapeオブジェクト(GraphicFrameオブジェクト)を追加します。

さらに、tableプロパティを続けてTableオブジェクトを取得します。

以降、このTableオブジェクトに対して属性を設定するので、「変数table」に格納しておきます。

23~25行目:【セルに値を設定する】

各セルに値を設定していきます。サンプルでは「列見出し」「行見出し」「その他」のセルといったように3つの「For文ループ」にて値を設定していきます。

以降、「列見出し」を例に解説します。24行目のcell()メソッドの引数にセルのインデックス(“A1”セルからのオフセット量)を指定して、Cellオブジェクトにアクセスします。その後、textプロパティにて、セルへ設定する値を設定します。

今回の場合は、リストにあらかじめ用意したコンテンツに順次アクセスしています。

テーブルのセルを扱う上での注意点は、セルに値を設定するのはセル毎に行う必要があることです。Excel VBAのように複数のセル範囲に、一度にまとめて値を設定するといったことはできません。(41~44行目でも2重のForループを個別セルごとに値を設定しています。)


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

スライドに指定した位置と大きさでテーブルを張り付けることができました。各セルには、指定した値が設定されています。(図7)

表の作成
図7 List1の実行結果

2.2 テーブルのセルに書式を設定する【SAMPLEコード②】

もう一つコード例を紹介します。

コードの概要は、<List1>で保存したプレゼンテーションを読込んで、テーブルの外観を各種プロパティを使って整えます。具体的にはフォントの編集(フォント、文字色、中央揃え)と、セルの編集(塗りつぶし)を行います。

from pptx import Presentation
from pptx.dml.color import RGBColor
from pptx.enum.text import PP_ALIGN  # テキストフレームの位置調整のためのクラス
from pptx.util import Pt             # ポイント指定するためのクラス


prs = Presentation('Blog_表の作成.pptx')  # 既存のファイルを読み込む
table = prs.slides[0].shapes[1].table    # Tableオブジェクトの取得
 
#-------------------------------------------------------------------------------------
for col_obj in table.columns:
    print(col_obj)       # <pptx.table._Column object at 0x0000021B8A7FC588> など列数情報4つ
                                          
for row_obj in table.rows:	
    print(row_obj)	     # <pptx.table._Row object at 0x0000021B8A7FC588> など行数情報4つ


#--------------------------------------------------------------------------------------
# 列見出しの装飾
for i in range(len(table.columns)):	        # テーブルの列数の取得 
    cell = table.cell(0, i)
    pg = cell.text_frame.paragraphs[0]	    # paragraph(段落)オブジェクトの取得
    pg.font.size = Pt(15)		                # 段落のフォントの大きさの設定
    pg.font.color.rgb = RGBColor(255, 0, 0) # 段落のフォントの色の設定
    pg.aligment = PP_ALIGN.CENTER	          # 段落の文字列の位置の設定(中央合わせ)

#---------------------------------------------------------------------------------------
# 行見出しの装飾
for i in range(len(table.rows)):   # テーブルの行数の取得
    cell = table.cell(i, 0)
    cell.fill.solid()			         # セルを塗りつぶす
    cell.fill.fore_color.rgb = RGBColor(100, 200, 50)   # セルの塗りつぶす色を指定
  
prs.save('Blog_表の作成_装飾.pptx')

ポイントを解説します。

20~25行目:【セルのフォント書式の設定】

22行目で、Cellオブジェクトから、「text_frame」「paragraph」プロパティを経て段落を得ます。次に23,24行目でfontプロパティを繋げて段落単位の書式設定(フォントサイズと色の指定)を行います。

また、25行目のaligmentプロパティで、セル内の配置を中央揃えに指定します。

29~32行目:【セルの塗り潰し】

fillプロパティでセルに塗り潰し効果を適用します。塗り潰しの種類はFillFormatオブジェクトとしていくつか提供されていますが、今回は単色で塗り潰します。(solid()メソッド)

セルの前景色をRGBで指定する意味の「fore_color.rgbプロパティ」にRGBColorオブジェクトを設定します。


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

「行見出しタイトル」にフォントサイズ、色、配置(中央揃え)を指定、「列見出しタイトル」に塗り潰し効果を適用することができました。(図8)

表の作成2
図8 <List2>の実行結果

3. まとめ

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

今回は「python-pptxライブラリ」を使って、テーブル(表)を作成する手順について解説してきました。

前回紹介したグラフ(大まかな傾向や将来予測)+テーブル(具体性)を組み合わせることで高品質な、第三者に対して分かりやすい資料となることでしょう。

記事でご紹介したテクニックを活用してい頂けると幸いです。

最後にここまでの記事内容をまとめておきましょう。

➀. Python-pptxではテーブル(表)をTableオブジェクトで管理している。

Tableオブジェクトは、add_table()メソッドで追加する。

➁. さらにTableオブジェクトは列情報(Column),行情報(Row)、セル情報(Cell)の各種

オブジェクトを包含した階層構造になっており、セル毎に値の参照や設定を行う。


さて、次回は図形を挿入する方法について解説していきたいと思います。

図・表・グラフをバランスよく配置し視覚に訴える資料をつくりましょう。

本連載の締めくくりはスライドに図を挿入する方法について、ポイントを絞り分かりやすく解説しました。ぜひ、こちらもお読みになってください。リンク先はこちらになります。↓

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

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