今回も引き続き、Pythonから「PowerPoint」を操作する機能を供する「python-pptx」ライブラリを紹介していきます。
連載の目次は、以下のようになっていますので参考になさってください。
さて、前回の記事ではグラフの作成手順について解説しましたが、グラフに続いて検討したいこととして思いつくのはスライドに「表(テーブル)」を挿入することではないでしょうか?
グラフで大まかな傾向を掴んだあとは、そのもととなるデータソースを併載することで資料の信ぴょう性や確度が高まり、より相手を納得させることができるでしょう。
表(テーブル)もまたExcelが得意とする機能ですので、一度Excelでつくった表をスライドに貼り付けて資料を作っていく手順が王道だと思います。
また、月次の売上報告のようにある程度資料の雛形ができていて表の数値を入れ替えるような場合は、わざわざExcelを経由することなく直接PowerPoinを操作してしまったほうが早いですし自動化もしやすくなると思います。
そこで、連載4回目となる今回はpython-pptxを使ってPowerPointだけで表を作成する 方法を紹介します。
この記事を読むことで次のことが分かるようなります。
なお、本記事内で紹介する各種クラスや関数などの使い方は一例です。省略可能なオプション引数などについては割愛していますので、詳細や不明点などは必要に応じて下記「公式ドキュメント」を参照してください。
python-pptx 公式ドキュメント(API Document)
https://openpyxl.readthedocs.io/en/stable/
1. スライドにテーブル・表(Tableオブジェクト)を貼る
本節では、スライドにテーブル(表)を挿入する手順と、Tableオブジェクト の概要について、さらにその関連属性について解説します。
1.1 スライドの構成要素とテーブルの関係
PowerPointは図1のように、プレースフォルダ(TITLE, BODY、、等)、図形(Shape)、グラフ、テーブル(表) などといったさまざまな要素によって構成されています。
これら、一つ一つの要素は「python-pptx」では Shapeオブジェクト として管理しています。本記事のメインテーマである、テーブル(表)もまた、Shapeオブジェクトの一種として扱われます。(図2)
それでは、次項よりテーブル(表)の「Shapeオブジェクト」に関連するオブジェクトやメソッド・プロパティについて解説していきます。
1.2 テーブル(表)のShapeオブジェクトを追加する
本項では「python-pptx」でスライドにテーブル(表)を挿入する手順の概要を解説します。
テーブルの挿入手順は図3のとおりです。(以降の説明の➀~➂は図3の番号に対応しています。)
➀ add_table()メソッド の引数にテーブルの大きさや配置位置を指定してShapeオブジェクト(テーブル)を取得します。次に➁で、Shapeオブジェクトから tableプロパティ にて Tableオブジェクト を取得します。
実は➀で取得したShapeオブジェクトの実体は、GraphicFrameオブジェクトと呼ばれる、グラフやテーブル、SmartArtを管理するコンテナとなります。よって②で、さらにTableオブジェクトを取得し配下の属性でグラフを作成します。
このTableオブジェクトはさらに、行、列、セルの単位(それぞれColumns,Rows,Cellsオブジェクト)に分解できます。それぞれの配下のさまざまなメソッド・プロパティでセルの値、色、幅、高さなどの詳細を設定できるようになります。(➂)
さらに、Columns,Rows,Cellsオブジェクトについてもう少し深堀りします。
図4は各種オブジェクトの構成イメージを示しています。(以降の説明の➀~➅は図4の番号に対応しています。)
テーブル全体を指し示す➀はTableオブジェクトです。その次のレイヤとして➁のColumnsオブジェクトと➂の Rowsオブジェクト があります。それぞれは列・行を要素とするイテラブルなオブジェクトになります。
Coloumns/Rowsオブジェクトは、For文や[インデックス]表記によりシーケンシャルにまたは個別に、各、行(Row)・列(Column)にアクセスすることができます(➃➄)。(“s”が付かないので注意)
また、個々のセルは Cellオブジェクト であり、テーブルは元より、行、列を構成する最小単位となり
ます。(➅)
ColumnやRowオブジェクト、ひいてはTableオブジェクトはCellオブジェクトの集合体となります。(図5)
各Cellオブジェクトには、インデックスが割り振られており、基準となる“A1”セルを”(0, 0)”として各セルにアクセスします。
それでは、それぞれのオブジェクトについて深堀りするのと同時に、関連するメソッド・プロパティの解説をします。
1.3 テーブルを構成するオブジェクトの取得と設定
先にも説明したように、テーブルを構成する要素にはShapeオブジェクトをはじめ、多くの関連オブジェクトや属性があります。本項では、それらの中から必須となるオブジェクトやその属性についてピックアップし整理します。
1.3.1 Shapesコレクションに要素(テーブル)を追加する
新たにテーブルを追加する場合には、テーブル用のShapeオブジェクトを追加(同時に取得も)する必要があります。python-pptxでは、add_table()メソッド を次の書式にように使うことで対応できます。
1.3.2 Tableオブジェクトを取得する
<1.2項>で少し補足しましたが、add_table()メソッド で追加したShapeオブジェクトの実体は、GraphicFrameオブジェクト と呼ばれる、グラフやテーブル、SmartArtを管理するコンテナです。
よって、テーブルを操作するには、さらにGraphicFrameオブジェクトから、Tableオブジェクトを取り出す必要があります。そのための属性が次の tableプロパティ になります。
1.3.3 Column/Rowオブジェクトの取得
テーブルを行・列の単位で管理するのが Rows/Columnsオブジェクト になります。
これらは、テーブルを構成するすべての行もしくは列をまとめた、イテラブルなオブジェクト(コレクション)です。次の書式のようにインデックスを指定して所望の行・もしくは列のオブジェクト
(Row/Column(※”s”が付かないことに注意)にアクセスします。
Columnオブジェクトには、列の幅を設定する widthプロパティ、Rowオブジェクトには、行の高さを設定する heightプロパティ が用意されています。
また、Row/Columnも構成要素であるCellオブジェクトへイテラブルにアクセスすることができます。
1.3.4 Cellオブジェクトの取得と設定
テーブルを構成する最小単位であるCellオブジェクト。その取得にはいくつかのパターンが用意されています。
テーブルを構成する最小単位はCellオブジェクトです。その取得には、いくつかの方法が用意されています。
【Cellオブジェクト.プロパティ】 | 【機能の説明】 |
---|---|
text | セルに値を設定する |
fill | 【FillFormatオブジェクト】を取得 FillFormatオブジェクトにより、各種塗り潰し効果を適用する |
text_frame | 【TextFrameオブジェクト】を取得 TextFrameオブジェクトにより段落や文字、書式の設定ができる |
merge(other_cell)メソッド | 複数のセルを結合する 引数:other_cel: 結合したいセル範囲を指定する(対角のセルのみ) |
split()メソッド | 結合セルを解除する 結合されていないセルに対して実行すると”ValueError”が発生する |
vertical_anchor | セルの垂直位置揃えの指定をする 【MSO_VERTICAL_ANCHOR】TOP(上揃え)、MIDDLE(中央揃え)、BOTTOM(下揃え) |
Cellオブジェクトには、「数値」「文字列」(textプロパティ)は設定できますが、「画像」「図形」は設定できません。また、段落(text_frameプロパティ)も設けることができます。
また、複数セルを一つに結合(マージ)することも可能です。結合には、marge()メソッド、結合の解除には split()メソッド を次のような引数指定で使います。
以上が、テーブル作成に関連するオブジェクトとその属性についての解説となります。
最後に、階層構造をまとめておきましょう。
2. スライドにテーブル(表)を挿入する実例
これまでに、テーブル作成に関するオブジェクトと属性について解説してきました。それらが、実際にどのような使われ方をするのか、実例を交えて確認しましょう。
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')
ポイントを解説します。
セルを扱う上での注意点は、値を設定するには個別セルごとに行う必要があるということです。Excel VBAのように複数のセル範囲に、一度にまとめて値を設定するといったことはできません。(41~44行目でも2重のForループを個別セルごとに値を設定しています。)
<List1>の実行結果は次のようになりました。
スライドに、テーブルを指定した位置と大きさで張り付けることができました。各セルには、指定した値が設定されています。(図7)
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')
ポイントを解説します。
<List2>の実行結果は次のようになりました。
「行見出しタイトル」にフォントサイズ、色、配置(中央揃え)を指定、「列見出しタイトル」に塗り潰し効果を適用することができました。(図8)
3. まとめ
いかがでしたでしょうか?
今回は「python-pptxライブラリ」を使って、テーブル(表)を作成する手順について解説してきました。
前回紹介したグラフ(大まかな傾向や将来予測)+テーブル(具体性)を組み合わせることで高品質な、第三者に対して分かりやすい資料となることでしょう。
記事でご紹介したテクニックを活用してい頂けると幸いです。
最後にここまでの記事内容をまとめておきましょう。
➀. Python-pptxではテーブル(表)を Tableオブジェクト で管理している。Tableオブジェクトは、add_table()メソッド で追加する。
➁. さらにTableオブジェクトは列情報(Column)、行情報(Row)、セル情報(Cell)の各種オブジェクトを包含した階層構造になっている。セルの値の参照や設定は、Cellオブジェクトを通して行う。
さて、次回は図形を挿入する方法について解説していきたいと思います。
図・表・グラフをバランスよく配置し視覚に訴える資料をつくりましょう。
本連載の締めくくりはスライドに図を挿入する方法について、ポイントを絞り分かりやすく解説しました。ぜひ、こちらもお読みになってください。リンク先はこちらになります。↓
最後までお読み頂きありがとうございました。