PowerPoint(パワポ)ドキュメント作成をPythonで自動化する方法について紹介します。
今回は、パワーポイントで表の作成を自動化する方法を説明したいと思います。
PowerPoint資料では表(table)の作成を行うことは多いと思います。プレゼンテーションでは、図や表は必須です。
毎回の資料作成で、表にポチポチデータを入力するのは、とても面倒です。Excelで表を作ってコピペ・・・これも面倒です。
サクッと、パワーポイント内で表を自動作成してしまったほうが効率的だと思います。
Python-pptxではパワーポイントの表の作成も自動化出来てしまいますので、マスターしましょう。
まずはスライドの作成
今回必要なモジュールのインポートと、Python-pptxでパワーポイントの新規スライド作成を行います。新規スライド作成に関する説明は、以前の記事を参照してください。
from pptx import Presentation
#Presentaionオブジェクトを生成
ppt = Presentation()
#白紙のスライドを選択
slide_layout = ppt.slide_layouts[6]
#白紙のスライドを追加
slide = ppt.slides.add_slide(slide_layout_6)
#ここにコードを追加していきます
ppt.save("./python_table.pptx")
Pythonでパワーポイントを自動化:表(テーブル)の作成
ここでは、4行4列の表を作成します。表(テーブル)を作成するには、以下のようにします。
row = 行数、col = 列数、 x_pos = x座標、y_pos = 座標、 width = 横幅、height = 高さを表しています。
row = 4; col = 4 ; x_pos = 0; y_pos = 0
width = Inches(6); height = Inches(6)
table = slide.shapes.add_table(row, col, x_pos, y_pos, width, height).table
表を作成するには、SlideShapesオブジェクト(*)のadd_tableメソッドを使用し、GraphicFrameオブジェクト(*)が作成します。GraphicFrameオブジェクトのtableプロパティを使用することで、Tableオブジェクト(*)が生成されます。
では、上のソースコード(ppt.saveの前)に表の作成部分を追加してみましょう。
(省略)
#tableの作成
x, y, cx, cy = Inches(2), Inches(2), Inches(6), Inches(4.5)
row = 4
col = 4
table = slide_6.shapes.add_table(row, col, x, y, cx, cy).table
(省略)
4行4列の表が作成されました!
Pythonでパワーポイントを自動化:テキストや数値を挿入
表を作成したので、表に数字や文字を入れていきましょう。
例えば、1行2列目のセルに数値に数値を挿入したい場合は以下のようにします。
row = 0; col = 1
table.cell(row, col).text = 1
行と列は0始まりなので、1行目を指定するには0を、2列目を指定するには1を設定します。
セルに値を挿入するには、Tableオブジェクトのcellメソッドで値を挿入したいセル(行と列)を指定します。cellメソッドは_Cellオブジェクト(*)を返します。そして、_Cell オブジェクトのtextプロパティを介してセルに値を挿入します。
では実際のコードを見てみましょう。
(省略)
#テキストの挿入
table.cell(0, 1).text = "1st Column"
#text_frameを使用して、_Paragraph.textでテキストを挿入
pg = table.cell(0,2).text_frame.paragraphs[0]
pg.text = "2nd Column"
pg.font.color.rgb = RGBColor(255, 0, 0)
#text_frameを使用して、_Run.textでテキストを挿入
pg = table.cell(0, 3).text_frame.paragraphs[0]
run = pg.add_run()
run.text = "3rd Column"
run.font.color.rgb = RGBColor(0, 255, 0)
#各セルにテキストを挿入
table.cell(1, 0).text = "1st Row"
table.cell(2, 0).text = "2nd Row"
table.cell(3, 0).text = "3rd Row"
for row in range(1, 4):
for col in range(1, 4):
table.cell(row, col).text = "cell({0}, {1})".format(row, col)
#最初の行を見出しとするか
table.first_col = False
#最初の列を見出しとするか
table.first_row = True
(省略)
上の例では、text以外にもtext_frameプロパティを使ってセルに値を挿入することもできます。text_frameプロパティを使ったテキストの挿入に関しては、過去の記事を見てください。テキストに色を変えたりする場合は、text_frameプロパティを使う必要があります。上のコードでは文字の色も変えています。
26行目、28行目では、最初の行、列を見出しとするかを設定しています。見出しとすることで、文字がボールドになったりします。
以下のように表(テーブル)の各セルに値が入力されました!
Pythonでパワーポイントを自動化:セルの調整
セルを結合する
3行2列目のセルと3行3列目のセルを結合してみましょう。以下のコードを先程のコードに追加してください。
セルを結合するには、_Cellオブジェクトのmergeメソッドを使用します。
(省略)
table.cell(2, 1).merge(table.cell(2,2))
(省略)
行の高さと列の幅を変える
セルの幅を変更してみましょう。2列目の幅と3行目の高さを変えて見ましょう。以下のコードを追加してください。
(省略)
table.rows[2].height = Cm(4)
table.columns[1].width = Cm(2)
(省略)
セルの幅を変更するには、tableオブジェクトのcolumnsメソッドを実行して_Columnオブジェクト(*)のコレクションを取得します。columns[1]リストのようにインデックスを指定することで、列を指定することが出来ます(この場合は2列目)。そして、_Columnオブジェクトのwidthプロパティで列の幅を指定します。
行の高さは、tableオブジェクトのrowsメソッドを実行して、_Rowオブジェクト(*)を取得し、_Rowオブジェクトのheightプロパティで変更します。
上のコードを実行すると、以下のように3行目と2列目の幅が変わるはずです。
セルを塗りつぶす
セルの塗りつぶしを行います。2行3列目のセルを塗りつぶします。
(省略)
table.cell(1, 2).fill.solid()
table.cell(1, 2).fill.fore_color.rgb = RGBColor(255, 255, 0)
(省略)
セルの塗りつぶしを行うには、_Cellオブジェクトのfillメソッドを実行してFillFormatオブジェクト(*)を作成します。そして、FillFormatオブジェクトのsolidメソッドを実行します。solidは、塗りつぶしの書式を均一な色にするために実行します(注1)。
塗りつぶしの書式設定を行った後に、FillFormatオブジェクトのfore_colorメソッドを実行します。fore_colorメソッドはColorFormatオブジェクト(*)を返します。ColorFormatオブジェクトのrgbプロパティにRGBオブジェクト(*)をセットすることで、色を指定することが出来ます。
(注1)塗りつぶしの書式をグラデーション、パターンにも設定できます。あまり使用頻度は高くないと思いますが、グラディエーションやパターンで塗りつぶしを行いたい場合は、マニュアルを参照してください。
上のコードを実行すると、cell(1, 2)が黄色に塗りつぶされます。
セルの余白と文字の配置を調整する
セルの余白を調整して、文字の配置を調整します。3行4列目の余白を変えて、2行4列目の文字揃えを中央揃えをしてみましょう。
セルの余白設定には、_Cellオブジェクトのmargin_left、margin_topを使用します。文字の中央揃えはvertical_anchorを使用します。
(省略)
#セルの左の余白
table.cell(2, 3).margin_left = Inches(0.5)
#セルの上の余白
table.cell(2, 3).margin_top = Cm(2)
#文字の中央揃え
table.cell(1, 3).vertical_anchor = MSO_ANCHOR.MIDDLE
(省略)
セルの右側に余白を入れたい場合はmargin_right、下側に余白を入れたい場合はmargin_bottomを使用します。
文字の配置を中央揃え以外にしたい場合は、こちらをみて色々試して見ると良いでしょう。
上のコードを実行すると、以下のようになります。