【Python×PowerPoint】python-pptxでテーブル(表)を作成する方法【徹底解説】

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

English | Japan

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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」でスライドにテーブル(表)を挿入する手順の概要を解説します。

テーブルの挿入手順は図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セルに値を設定する
fillFillFormatオブジェクトを取得
FillFormatオブジェクトにより、各種塗り潰し効果を適用する
text_frameTextFrameオブジェクトを取得
TextFrameオブジェクトにより段落や文字、書式の設定ができる
merge(other_cell)メソッド複数のセルを結合する
引数:other_cel: 結合したいセル範囲を指定する(対角のセルのみ)
split()メソッド結合セルを解除する
結合されていないセルに対して実行すると”ValueError”が発生する
vertical_anchorセルの垂直位置揃えの指定をする
MSO_VERTICAL_ANCHOR】TOP(上揃え)、MIDDLE(中央揃え)、BOTTOM(下揃え)
表1 Cellオブジェクト配下の属性

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

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

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

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

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

python-pptx_Hierarchical structure of Table object_rev0.2_En
図6. Tableオブジェクトの階層構造
スポンサーリンク

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

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)の各種オブジェクトを包含した階層構造になっている。セルの値の参照や設定は、Cellオブジェクトを通して行う


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

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

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

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

English | Japan

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