python PR

pythonでパワポ操作〜テキスト編集について〜【サンプルコードあり】

python パワポ テキスト
記事内に商品プロモーションを含む場合があります

今回の記事では、pythonでパワポを操作して、テキスト編集を行う方法について解説をしていきたいと思います

前回の記事では、スライドを作成する方法やプレースホルダーについて解説をしました

初めてpythonでパワポ操作をする場合には、前回の記事からスタートすると理解が深まります

python python-pptx
pythonでパワポ操作〜python-pptxの導入からスライド作成〜【サンプルコードあり】pythonの得意なことといえば、事務作業の自動化が挙げられます。しかし、python×パワポという書籍はまだありません・そこで、今回はpythonでパワポを操作する方法について解説していきたいと思います・ パワポやエクセルなどは、会社員であれば、必ず使用するソフトです。これらを自動化することができれば、作業時間をかなり短縮することができます。...

この記事で学べること
pythonでパワポを操作する方法がわかる
pythonでパワポのテキストを編集することができる
pythonから文字色や複数行の文字列を設定することができる

pythonでパワポ操作〜テキスト編集について〜

テキスト編集

pythonからパワポのテキストを編集するには、「TextFrame」を使用していきます

TextFrameとは

TextFrameオブジェクトとは、テキストのフレームワークを指しています

パワーポイントには、図形やテキストボックスなどテキストを編集することができる領域が設定されています

この、テキストを編集することができる領域のことを「TextFrame」と呼びます

パワポを操作している場合には、TextFrameを意識することはありませんが、pythonでパワポを操作する場合には、TextFrameで指定して、テキストを編集していきます

TextFrame

TextFrameを指定することによって、インデントやフォント、文字色などを設定することが可能になります

しかし、これらを設定するには「TextFrame」以外にも必要なものがあり、

  • Paragraphオブジェクト
  • Runオブジェクト

の知識が必要になります

TextFrameオブジェクトParagraphオブジェクトRunオブジェクト
テキスト設定可能不可不可
複数行設定可能可能不可
文字の詳細設定可能可能可能

TextFrameの使い方

では実際にTextFrameを使って、テキストを編集していきたいと思います

TextFrameでテキストを編集する場合には、既存のPowerPointファイルを読み込んで行なっていきます

手順としては、以下のようになります

  1. 既存ファイルの読み込み
  2. スライド内にある要素・種類を抽出
  3. TextFrameが含まれているかを確認
  4. TextFrameの取得
  5. テキストの編集
from pptx import Presentation
from pptx.enum.text import MSO_AUTO_SIZE 
prs=Presentation('.pptx')

#1ページ目(「タイトル スライド」のレイアウトを指定)
slide_layout_0 = prs.slide_layouts[0]
slide_1 = prs.slides.add_slide(slide_layout_0)
old_sld0_layout0=prs.slides[0] #既存スライドを読み込む

for shape in old_sld0_layout0.shapes: #読み込んだ既存スライドから図形(shapeオブジェクト)を探す
    print(shape.name)           #探した図形の番号を返す(ex.Title 1 Subtitle 2)
    if not shape.has_text_frame:      #shapeオブジェクトにTextFrameが含まれているかを確認
        continue
    
    textFrame = shape.text_frame    #図形(shapeオブジェクト)からTextFrameを取得
    textFrame.text='textFrameのサンプル'#TextFrameにテキストを入力
    textFrame.autosize = MSO_AUTO_SIZE.TEXT_TO_FIT_SHAPE #TextFrameのフォントサイズを自動調整
    textFrame.word_wrap = True                 #TextFrame内テキストの折り返しを有効に
    

#PowerPointを保存
prs.save("powerpnt.pptx")
textFrameサンプル

TextFrameオブジェクトにはいくつかのプロパティがあります

プロパティ機能設定
textプロパティテキストフレームに文字を入力・取得
word_wrapプロパティ文字列の折り返しTrueで有効.
デフォルトはFalse
margin_top(bottom)プロパティ上下の余白を調整
margin_left(right)プロパティ左右の余白を調整
autosizeプロパティ文字のサイズを自動調整.
MSO_AUTO_SIZEを使用

MSO_AUTO_SIZE

NONE…自動調整しない.
SHAPE_TO_FIT_TEXT…フレームサイズをテキストに合わせる
TEXT_TO_FIT_SHAPE…テキストをフレームサイズに合わせる

vertical_anchorプロパティ文字の上下位置.
MSO_VERTICAL_ANCHORを使用

MSO_VERTICAL_ANCHOR

TOP…上揃え
MIDDLE…中央揃え
BOTTOM…下揃え

余白の調整

pythonでパワポ操作〜段落の編集について〜

段落編集

テキスト入力は1行で済む場合もあれば、複数行になることもあります

複数行になった場合に、段落の編集をするのが、「Paragraphオブジェクト」になります

Paragraphオブジェクトについて

Paragraphオブジェクトとは、TextFrame内の段落を調整するものになります

TextFrame内の文字が1行であれば問題ありませんが、複数行になったときには、Paragraphオブジェクトの設定が必要になります

from pptx import Presentation
from pptx.enum.text import MSO_AUTO_SIZE 
#既存スライドの読み込み
prs=Presentation('.pptx')

#既存スライドの1枚目を読み込み
old_sld0_layout0=prs.slides[0]

#スライド上のShapeオブジェクト(テキストボックス)の属性情報の抽出
#has_text_frame属性が「True」でTextFrameオブジェクトの包含が可能
for shape in old_sld0_layout0.shapes:
    print(shape.shape_type, shape.name, shape.has_text_frame)

#TextFrameオブジェクトに段落(Paragraphオブジェクト)を2つ追加する
#rangeの数値を変えると段落の数が変化
for text in range(2):
    old_sld0_layout0.shapes[0].text_frame.add_paragraph()
    old_sld0_layout0.shapes.text_frame.add_paragraph()

#PowerPointを保存
prs.save("powerpnt.pptx")
paragraphparagraph1 paragraph2

段落の調整ができたので、次は字下げとフォントの位置調整です

from pptx import Presentation
from pptx.enum.text import MSO_AUTO_SIZE 
from pptx.enum.text import PP_ALIGN
prs=Presentation('.pptx')

old_sld0_layout0=prs.slides[0]

for shape in old_sld0_layout0.shapes:
    print(shape.shape_type, shape.name, shape.has_text_frame)

paras =old_sld0_layout0.shapes[0].text_frame.paragraphs

for i, para in enumerate(paras,0):
    para.text="字下げ"
    para.level=i

paras = old_sld0_layout0.shapes.text_frame.paragraphs

for i, para in enumerate(paras, 0):
    para.text = "段落ごとの水平位置(左/中央/右揃え)を指定する"
#PP_ALIGN.LEFT, PP_ALIGN.CENTER, PP_ALIGN.RIGHTで選ぶ
    para.alignment = PP_ALIGN.CENTER

#PowerPointを保存
prs.save("powerpnt.pptx")

最後にフォントの調整と段落間の調整です

from pptx import Presentation
from pptx.enum.text import MSO_AUTO_SIZE 
from pptx.enum.text import PP_ALIGN
from pptx.enum.dml import MSO_THEME_COLOR
from pptx.util import Pt 


prs=Presentation('.pptx')

old_sld0_layout0=prs.slides[0]

for shape in old_sld0_layout0.shapes:
    print(shape.shape_type, shape.name, shape.has_text_frame)

paras =old_sld0_layout0.shapes[0].text_frame.paragraphs

for i, para in enumerate(paras, 0):
    para.text = "文字列のフォントを調整"
  #MSO_THEME_COLOR.ACCENT_1, MSO_THEME_COLOR.ACCENT_2, MSO_THEME_COLOR.ACCENT_6から選択
    para.font.color.theme_color = MSO_THEME_COLOR.ACCENT_1  # フォントの色
    para.font.bold = True  # フォントの大きさ
    
for para in paras:
    para.text = "15ptで調整"
    para.space_after = Pt(15)
#PowerPointを保存
prs.save("powerpnt.pptx")

Paragraphオブジェクトのプロパティ

TextFrameと同じように、Paragraphオブジェクトにもプロパティがあります

プロパティ機能設定
textプロパティ段落に文字列を追加
levelプロパティ段落の字下げ0〜8で調整
fontプロパティフォント設定Fontオブジェクトを使用
alignmentプロパティ文字列の水平位置PP_ALIGNを使用
line_spacingプロパティ行間の高さを指定ptで指定
space_after(before)プロパティ前後の段落の調整ptで指定

enumerate関数について

コードの途中で出てきた「enumerate」ですが、このenumerate関数を使うことで、要素のインデックスと要素を同時に取り出すことができます

似ている関数に、「range関数」もありますが、range関数ではインデックスを取り出すだけになります

pythonman = ['未経験独学', '収益化ばっちり', 'twitter自動化']
for i, j in enumerate(pythonman):
  print('{0}:{1}'.format(i, j))

>>>出力結果
0:未経験独学
1:収益化ばっちり
2:twitter自動化

まず1行目でpythonmanにリストを代入しています

2行目のfor文で変数iとjにpythonmanを代入し続けます

このとき、変数iにはlistの添字が代入されるので、0〜2の数字が代入されることになります

そのため、変数iには数字、変数jには文字列、という状況になっています

それをprintで出力すると、上記のような出力結果になります

pythonでパワポ操作〜文字単位での編集について〜

文字単位での編集

文字単位での編集を行うには、「Runオブジェクト」を使用します

Runオブジェクトとは

Runオブジェクトは、文字列の最小単位を調整するオブジェクトになります

文字列の最小単位は1文字ずつになり、単語になります

1文字ずつ色を変更することは少ないですが、単語レベルで文字色を変えることはありますので、覚えておいて損はありません

from pptx import Presentation
from pptx.dml.color import RGBColor

prs = Presentation()

#"タイトルとコンテンツ"のレイアウトオブジェクトを取得
title_slide_layout = prs.slide_layouts      	
#新しいスライドを追加(タイトルとコンテンツ)
old_sld0_layout0 = prs.slides.add_slide(title_slide_layout) 

#スライド中の要素を抽出、種類を表示
for s in old_sld0_layout0.shapes:
    print(s.name)

    
old_sld0_layout0.shapes[0].text = '文字色を変更'
pg = old_sld0_layout0.shapes[0].text_frame.paragraphs[0]
# 段落(paragraphオブジェクト)を操作するために、runオブジェクトを取得する
rn = pg.runs[0]

# runオブジェクトのfont.color.rgbプロパティに文字色を指定
rn.font.color.rgb = RGBColor(50, 185, 20)

tf = old_sld0_layout0.shapes[0].text_frame
tf.add_paragraph()
pg = old_sld0_layout0.shapes[0].text_frame.paragraphs

rn0 = pg.add_run()
rn0.text = 'AAA'
rn0.font.color.rgb = RGBColor(255, 0, 0)

rn1 = pg.add_run()
rn1.text = 'BBB'
rn1.font.color.rgb = RGBColor(0, 255, 0)

rn2 = pg.add_run()
rn2.text = 'CCC'
rn2.font.color.rgb = RGBColor(0, 0, 255)

prs.save('テキストカラー変更.pptx') 
テキストカラーの変更

Runオブジェクトのプロパティ

Runオブジェクトのプロパティは以下のようになります

プロパティ機能設定
textプロパティ文字列の追加
fontプロパティフォント設定Fontオブジェクトを使用
hyperlink.addressプロパティリンクの割り当てURL設定

python-pptxについて詳しく知りたい場合には、公式ドキュメントがおすすめです

python-pptx公式ドキュメント

おすすめプログラミングスクール

DMMWEBCAMP
  • WEBCAMPはコスパ最強
  • WEBCAMPは初心者に優しい充実したサポート付き
  • 16週間プランを選択して、返金してもらおう
WEBCAMPの公式ページはこちら WEBCAMPの口コミ・評価はこちら
テックアカデミー  
  • テックアカデミーは費用対効果抜群
  • テックアカデミーのサポートは個人の能力に応じつつ、python初心者に優しい
  • まずは無料体験でテックアカデミーを知ってから受講を決める
テックアカデミーの公式ページはこちら テックアカデミーの口コミ・評価はこちら
キカガク
  • 多種多様なスキルコース
  • 初心者から専門家まで対象
  • 給付金利用で費用を抑えられる
キカガクの公式ページはこちら キカガクの口コミ・評価はこちら
Aidemy Premium
  • 完全オンラインで、時間や場所に縛られず学習したい
  • マンツーマン学習サポートにより実践に近い経験をしたい
  • 未経験から機械学習エンジニアになりたい
Aidemy Premiumの公式ページはこちら Aidemy Premiumの口コミ・評価はこちら
My Agile Privacy
This website uses technical and profiling cookies. Clicking on "Accept" authorises all profiling cookies. Clicking on "Refuse" or the X will refuse all profiling cookies. By clicking on "Customise" you can select which profiling cookies to activate.