Python外部ライブラリ(python-docx)で『Word』ドキュメントにスタイルを設定する

スポンサーリンク
Python外部ライブラリ(python-docx)ドキュメントスタイル書式設定 python-docx

前回に続きMS-Office WordをPythonで操作するライブラリとして「python-docx」の解説をしていきます。

これまでに、「python-docx」を使ってWordを操作する方法として、「文章を作成する」

「画像や表を挿入する」それから「セクションでページ設定をする」といったことを取り上げてきました。

関連記事のリンクはこちらになります。

「python-docx」の基本を押さえてから以降の内容に進まれた方が理解しやすいと思われますし重複する解説は割愛しておりますのでまずはこちらを一読されることをお勧めします。

さて、最終回となる今回の記事では「スタイルを設定する」方法を解説していきます。

WordのUIでは次のメニュー項目でスタイル設定することができます。

Word_UI_スタイルの書式設定
図1 Word UIによるスタイル設定メニュー

これまでも文章や表(テーブル)を作成する際に使った、ParagraphオブジェクトRanオブジェクトTableオブジェクトを取得する時などに「style」引数やプロパティを使って設定してきました。

実は「python-docx」ではスタイルに関して Styleオブジェクト というオブジェクトが用意されていまして、より細かく独自にカスタマイズすることもできます。

今回の記事はこの「スタイル」についてもう少し深堀して解説したものになります。

先に要点をまとめておくと、本記事では次のようなことについて触れています。

➀. python-docxで設定できるStyleオブジェクトの種類とその概要について

➁. python-docxが用意しているbuilt-in styleの全種類リファレンス

➂. ユーザー独自定義スタイル(custom style)の追加と関連プロパティの理解

本サイトでの紹介例は一例です。また、関数などの省略可能なオプション引数などについては割愛していますので、詳細や不明点などは必要に応じて公式サイトなどを参照してください。

<公式サイト>https://python-docx.readthedocs.io/en/latest/

それでは、次節からは具体的な各種オブジェクトの扱い方について詳しく解説していきます。

スポンサーリンク

1.スタイル(Styleオブジェクト)の概要

スタイルの取得・設定・追加するなどの操作をするために「python-docx」では Styleオブジェクト というものが用意されています。まずは、「Styleオブジェクト」の概要としてオブジェクトの種類・階層構造を理解した上で、実際にスタイルを適用する手順について再度確認することにします。

1.1 Styleオブジェクトの種類と階層構造

Wordファイル本体を表すDocumentオブジェクトの直下には、StyleオブジェクトのコンテナであるStylesオブジェクト (末尾にsが付加されます)が配置されています。作成したWordファイル中にあるスタイルの書式は全てこのStylesオブジェクト内で管理されています。(図2を参照)

Document-Stylesオブジェクトの関係
図2 DocumentオブジェクトとStylesオブジェクトの関係

個々のStyleオブジェクトはさらにWordドキュメントの構成要素である段落・文章・表(テーブル)の機能ごとに分類され「_ParagraphStyleオブジェクト」、「_CharacterStyleオブジェクト」、「_TableStyleオブジェクト」となります。また各オブジェクトに共通する機能は「BaseStyleオブジェクト」として集約されるといった階層構造になります。(図3)

Styleオブジェクトの種類(機能別)
図3 Styleオブジェクトの機能による分類

上記Styleオブジェクトは「ライブラリに組み込まれて直ぐに設定できるものと」とユーザーが独自に定義(カスタム)することができるタイプのものに大別されます。それぞれ、「Built-in styles」と「Custom styles」と公式サイトでは読んで区別していますので本記事でもそれに合わせています。

Styleオブジェクトの種類(定義別)
図4 styleオブジェクトの定義方法による分類

Built-in stylesについてはこの後の第2章で、「Custom styles」とStyleオブジェクト配下の主なメソッド・プロパティについては第3章で詳しく解説します。

1.2 スタイルの適用

スタイルを適用する手順を解説します。

スタイル(Styleオブジェクト)を適用するには2通りの方法があります。

1つ目は「add_paragraph()」、「add_run()」つまり、段落・表・文字(オブジェクト)を追加するメソッドのオプショナル引数「style」に「スタイル名」や「Styleオブジェクト」を指定する方法です。

スタイル対象メソッド引数の説明
段落(Paragraph)Documentオブジェクト.add_paragraph(text, style)引数1:text:段落に設定する文章を設定(オプショナル引数)
引数2:style:段落に設定するスタイルを指定する(オプショナル引数)
文字(Character)Paragraphオブジェクト.add_run (text, style)引数1:text:段落に設定する文章を設定(オプショナル引数)
引数2:style:段落に設定するスタイルを指定する(オプショナル引数)

いずれも、引数styleは省略可能で、省略した場合はDefaultスタイルが適用されます。

2つ目は、段落・表・文字の各オブジェクトがそなえるstyleプロパティを使って設定する方法です。設定のほか、現在の適用スタイルを取得することもできます。 メソッド同様に「スタイル名」や「Styleオブジェクト」で指定します。

スタイル対象プロパティ設定・取得
段落(Paragraph)Paragraphオブジェクト.styleプロパティ段落のスタイルの取得と設定
スタイル名Styleオブジェクトで設定
文字(Character)Runオブジェクト.styleプロパティ文字のスタイルの取得と設定
スタイル名Styleオブジェクトで設定
表(Table)Tableオブジェクト.styleプロパティ表のスタイルの取得と設定
スタイル名Styleオブジェクトで設定

それでは、メソッドやプロパティで段落や文章のスタイルを設定・取得する実際のコードを確認してみます。(List1)

from docx import Document

doc = Document() # Documentオブジェクトの取得


# (A)--------------------------------------------------------------------------------
# メソッドの引数styleによるスタイルの設定


# 段落:スタイル名(Title)による指定・・・[A1]
pg1 = doc.add_paragraph('メソッド引数style=名前による設定', style='Title') 
print(pg1.style.name) # >>Title

# 文字:スタイル名(Subtitle Char)による指定・・・[A2]
run1 = pg1.add_run('add_run() 引数style=名前による設定', style='Subtitle Char')
print(run1.style.name) # >>Subtitle Char

#-----------------------------

# 段落:Styleオブジェクトによる指定・・・[A3]
pg2 = doc.add_paragraph('add_paragraph() 引数style=オブジェクトによる設定', style=doc.styles['Intense Quote'])
print(pg2.style.name) # >>Intense Quote


# (B)--------------------------------------------------------------------------------
# プロパティによるスタイルの設定と取得

# 段落: デフォルトスタイルの確認・・・[B1]
pg3 = doc.add_paragraph('段落:プロパティによるスタイルの設定')
print(pg3.style.name) # >>Normal

# 段落: スタイル名(Caption)による設定と取得
pg3.style = 'Caption' # styleプロパティでスタイル名'Caption’に設定
print(pg3.style.name) # >>Caption

#-----------------------------

# 文字:デフォルトスタイルの確認・・・[B2]
run3 = pg3.add_run('文字:プロパティによるスタイルの設定')
print(run3.style.name) # >>Default Paragraph Font

# 文字: スタイル名(Strong)による設定と取得
run3.style = 'Intense Emphasis'  # styleプロパティでスタイル名'Intense Emphasis’に設定
print(run3.style.name) # >>Intense Emphasis

#-----------------------------

# 段落: Styleオブジェクトによる設定・・・[B3]
pg4 = doc.add_paragraph('段落:プロパティによるスタイルの設定(オブジェクト)')
pg4.style = doc.styles['Body Text'] #  styleプロパティでオブジェクト'Body Text'を設定
print(pg4.style.name) # >>Body Text


doc.save('Styleを適用する.docx')

ポイントを解説します。

・10~22行目では、メソッドの引数styleに「スタイル名」もしくは「Styleオブジェクト」を設定しています。(A)メソッドを実行した後に nameプロパティ でスタイル名を確認していますが、設定した通りのスタイルになっています。

・28~51行目では、対象オブジェクトの styleプロパティ によってスタイルの設定や取得をしています。メソッドと同じように「スタイル名」もしくは「Styleオブジェクト」での設定が可能になっています。

※Styleオブジェクト配下の主なメソッド・プロパティについては第3章で詳しく解説します。

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

Styleの設定.取得の確認
図5 List1の実行結果

設定したとおりのスタイル設定になっていることが確認できました。

A1: Title,  A2: Subtitle Char,  A3: Intense Wuote

B1: Normal → Caption, B2:Default Paragraph Font → Insense Emphasis/

B3: Body Text

2.組込みスタイル(Built-in Styles)の種類 [リファレンス]

Python_基本文法_内包表記

python-docxではあらかじめ数百程度のテンプレートとなるスタイルが組み込まれており、「スタイル名」をメソッドやプロパティに指定するだけで適用することができます。

本節ではこの既定スタイル(Built-in Styles)のデザインを全て紹介します。デザインレシピ集としてお役立てください。なお、筆者の動作確認環境は、「Microsoft Office Personal 2016」となります。環境の違いによっては見た目が異なる可能性がありますのであらかじめご了承ください。

2.1 段落の組込みスタイル(_ParagraphStyleオブジェクト)

段落の定義済みの組込みスタイル( _ParagraphStyleオブジェクト )の一覧は次のとおりとなります。

全36タイプありますがすべての例を示しています。

Paragraph styles in default template

https://python-docx.readthedocs.io/en/latest/user/styles-understanding.html#paragraph-styles-in-default-template
Paragraph_Built-in-Style➀
図6 Paragraph styles in default template➀

Paragraph_Built-in-Style②
図7 Paragraph styles in default template②

Paragraph_Built-in-Style➂
図8 Paragraph styles in default template➂

2.2 文字の組込みスタイル(_CharacterStyleオブジェクト)

文字の定義済みの組込みスタイル( _CharacterStyleオブジェクト )の一覧は次のとおりとなります。

全27タイプありますがすべての例を示しています。

Character styles in default template

https://python-docx.readthedocs.io/en/latest/user/styles-understanding.html#character-styles-in-default-template
Character_Built-in-Style➀
図9 Character styles in default template➀

Character_Built-in-Style②
図10 Character styles in default template②

2.3 テーブルの組込みスタイル(_TableStyleオブジェクト)

表の定義済みの組込みスタイル(_TableStyleオブジェクト)の一覧は次のとおりとなります。

全100タイプと数多くありますので、同一タイプで色違いの指定のものは割愛しています

Table styles in default template

https://python-docx.readthedocs.io/en/latest/user/styles-understanding.html#table-Paragraph styles in default template
Table_Built-in-Style➀
図11 Table styles in default template➀

Table_Built-in-Style②
図12 Table styles in default template②

Table_Built-in-Style➂
図13 Table styles in default template➂

3.ユーザ定義スタイル(Custom styles)について

スタイルは既定のBuilt-in Styleの中から選択するもの以外にもユーザが独自に定義・追加することも可能です。ここではユーザが定義するスタイル( Custom styles )について解説します。

また、Styleオブジェクトに関連したメソッドやプロパティについても本章でまとめています。

3.1 ユーザ定義スタイルの追加と削除の方法

スタイルを追加定義するには、まずStyleオブジェクトのコンテナであるStylesオブジェクトを取得した上でその配下の add_styles()メソッド を次の書式のように実行します。

Styleオブジェクト

Documentオブジェクト.stylesプロパティ

戻り値:Stylesオブジェクト


Stylesオブジェクト.add_style(name, style_type)

引数1:name: 追加定義するスタイル名

引数2:style_type: スタイルの種類をWD_STYLE_TYPEクラスの定義から選択

(文字:CHARACTER, 段落:PARAGRAPH,表:TABLE)

戻り値:Styleオブジェクト

1.1節で解説しようにStyleオブジェクトは共通機能をまとめた(BaseStyleオブジェクト)と個別要素(段落、文字、表)ごとの固有のStyleオブジェクトに分類されます。後者の個別要素のStyleオブジェクトはadd_style()メソッドの引数style_typeWD_STYLE_TYPEクラス の定義を渡します。(図13)

add_style()メソッドの引数指定
図13 add_style()メソッドの引数指定

次にStyleオブジェクトに関連したメソッドやプロパティについてまとめます。

BaseStyleオブジェクト配下の主なメソッド/プロパティにはスタイル名・種類の取得、削除するといった共通機能を提供します。

メソッド・プロパティ機能
Styleオブジェクト.nameプロパティスタイル名の取得
Styleオブジェクト.typeプロパティスタイルの種類を取得
Styleオブジェクト.delete()Styleオブジェクトの削除

次に個別要素ごとのStyleオブジェクトに関連したプロパティについてです。フォントの設定 fontプロパティ など段落・文・表(テーブル)どちらもほぼ同じ属性を持ちますが、段落の設定 paragraph_formatプロパティ にように段落/表のみに含まれる属性もあります。主なものは以下のようなものがあります。

プロパティ機能
Styleオブジェクト.base_styleプロパティベース(継承)とする既定のBuilt-in-Stylesオブジェクトが
あれば指定します
Styleオブジェクト.fontプロパティFontオブジェクトを取得し、フォントを設定します。
RunオブジェクトなどのFontオブジェクトと同様です。
Styleオブジェクト.paragraph_formatプロパティParagraph_Formatオブジェクトを取得し、フォーマットを設定します。
ParagraphオブジェクトのParagraph_Formatオブジェクトと同様です。
※_ParagraphStyle, _TableStyleのみ有効
Styleオブジェクト.next_paragraph_styleプロパティ段落を追加した際に適用するスタイルを設定します。
指定しない場合は、同じスタイルが適用されます。
※_ParagraphStyle, _TableStyleのみ有効

それでは、ユーザーが独自にスタイルを定義・追加するコード例を紹介します。

from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt, Inches, RGBColor    
from docx.enum.text import WD_ALIGN_PARAGRAPH


doc = Document()

styles = doc.styles # Stylesオブジェクト(Styleオブジェクトのコンテナ)を取得する

# add_style()メソッドで新規Styleオブジェクトを追加する
style = styles.add_style('Original-Style', WD_STYLE_TYPE.PARAGRAPH)


# base_styleプロパティで継承された既定スタイルを確認する
# 新規追加した場合は既定スタイルを継承していない
print(style.base_style) # >>None

# base_styleプロパティで既定スタイルを継承する
style.base_style=styles['Title']
print(style.base_style) # >>_ParagraphStyle('Title') id: 2408904452360


#---------------------------------------------------------------------------------
# Fontの定義

# 新規styleオブジェクトのフォント設定をするためにFontオブジェクトを取得する
font=style.font

# nameプロパティでフォントの取得と設定
print(font.name) # >>None
font.name='Meiryo UI'
print(font.name) # >>Meiryo UI

# sizeプロパティで文字サイズの取得と設定
print(font.size) # >>None
font.size=Pt(20)
print(font.size.pt) # >>10.0

# colorプロパティでフォント色の取得と設定
print(font.color.rgb) # >>None
font.color.rgb = RGBColor(255,0,0)
print(font.color.rgb) # >>FF0000

#---------------------------------------------------------------------------------
# Paragraph_Formattingの定義

# 新規styleオブジェクトの段落書式の設定をするためにParagraph-Formattingブジェクトを取得する
paragraph_format=style.paragraph_format

# alignmentプロパティで段落の位置揃えの取得と設定
print(paragraph_format.alignment) # >>None
paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT
print(paragraph_format.alignment) # >>CENTER (1)

# left_indentプロパティで段落の左インデントの取得と設定
print(paragraph_format.left_indent) # >>None
paragraph_format.left_indent = Inches(0.50)
print(paragraph_format.left_indent.inches) # >>0.5

#---------------------------------------------------------------------------------

# 新規追加したスタイルを段落に適用
doc.add_paragraph('Custom-Styleを定義し適用', style=style)

#print(len(styles)) # >>165
#style.delete()
#print(len(styles)) # >>164

#doc.add_paragraph('Custom-Styleを定義し適用', style=style)


doc.save('Custom Styleを定義する.docx')


print(len(styles)) # >>165
# delete()メソッドで追加スタイルを削除する
style.delete()
print(len(styles)) # >>164

# 削除されたスタイルを適用しようとしたので'AttributeError'が発生する 
#doc.add_paragraph('Custom-Styleを定義し適用', style=style) # 'NoneType' object has no attribute 'type'

ポイントを解説します。

➀.12行目で add_style()メソッド によって新しいスタイルを追加しています。その際、名前とスタイルの種類を引数に渡しています。ここでは段落用のスタイルを追加しています。

➁.20行目で base_styleプロパティ で継承するスタイルを設定しています。ここでは’Title’の組込みスタイルをベースにカスタマイズしていきます。

➂.27~43行目で新規Styleオブジェクトの fontプロパティ でFontオブジェクトを取得し「文字文体」、「文字サイズ」、「文字色」を設定と確認をしています。

➃.49~59行目で paragraph_formatプロパティ でParagraphFormatオブジェクトを取得し、「段落の位置揃え」「左インデント」を設定しています。

実行結果は以下のようになりました。

継承した組込みスタイル(‘Title’)をベースにフォントや段落をオリジナルデザインにすることができています。

Custom-Styleの適用のコード例の実行結果
図14 List2の実行結果

3.2 WordのUIに表示する

ユーザーが定義したスタイルはWordのメニューの一覧やリストに表示させることができます。これによりカスタムしたスタイルをコードからだけでなく、WordのUIから直接利用できるようになります。

表示できるのはスタイル一覧(the style gallery)と推奨リスト(list of recommended styles)になります。(図15)

スタイル一覧_推奨スタイル一覧のUI
図15 スタイル一覧と推奨リスト

Word UIへの表示設定に関連したプロパティは主に次のようなものがあります。

プロパティ機能
Styleオブジェクト.hiddenプロパティ対象スタイルを非表示にする(True:非表示/False:表示)
※スタイルの適用自体は可能
Styleオブジェクト.quick_styleプロパティ対象スタイルをUIの一覧へ表示させる(True:非表示/False:表示)
hiddenプロパティはFalseであることが前提
Styleオブジェクト.lockedプロパティ対象のスタイルを非表示・適用不可とする(True:保護/False:解除)
※Word書式の保護設定が有効になっていることが前提
Styleオブジェクト.priorityプロパティスタイル一覧の表示順位を指定する。Defaultは最優先
同じ順位のスタイルが複数ある場合は名前でソートされる

例えば「スタイル一覧」と「推奨リスト」を表示させるには、 hiddenプロパティFlasequick_styleプロパティTrueに設定する必要があります。その他の設定について整理すると図16

のようになります。

Styleオブジェクト_hidden,quick_styleプロパティ
図16 Word UIの表示・非表示するプロパティのまとめ

追加したスタイルをスタイル一覧や推奨リストに表示、表示の順番を指定している例を実際のコードで確認してみましょう。

from docx import Document
from docx.enum.style import WD_STYLE_TYPE

doc=Document()
# Stylesオブジェクトの取得
styles=doc.styles

# add_style()メソッドでスタイル名('Original-A')のスタイルを追加する
style_A=styles.add_style('Original-A', WD_STYLE_TYPE.PARAGRAPH)

# add_style()メソッドでスタイル名('Original-B')のスタイルを追加する
style_B=styles.add_style('Original-B', WD_STYLE_TYPE.PARAGRAPH)

#------------------------------------------------------------
# 初期状態(Default)の属性値を確認する

print(style_A.hidden)      # >>False
print(style_A.locked)      # >>False
print(style_A.quick_style) # >>False
print(style_A.priority)    # >>None

#------------------------------------------------------------
# スタイル名('Original-A')の属性を設定する
# Word UI 「スタイル一覧」 「推奨リスト」に表示
# 表示優先度は最高レベル

style_A.hidden=False
style_A.quick_style=True
style_A.priority=0

#------------------------------------------------------------
# スタイル名('Original-B')の属性を設定する
# Word UI 推奨リスト」のみに表示
# 表示優先度は最高レベル

style_B.hidden=False
style_B.quick_style=False
style_B.priority=2

doc.save('WordUI_with_Custum-Style.docx')

ポイントを解説します。

➀. 10,13行目で新規スタイルを追加します。

➁. 18~21行目で追加したスタイルの初期状態(Default)の属性値を確認しています。

hidden/quick_styleプロパティ がFalseなので推奨リストだけに表示される設定になっています。

➂. 28~30行目で1つ目のスタイルは、リスト一覧にも表示をし、表示優先度を最大「0」にしています。

➃. 37~39行目で2つ目のスタイルは、リスト一覧には非表示とし、推奨リストの表示優先度は「2」つまり3番目になるように設定しています。

実行結果は以下のようになりました。

スタイル一覧、推奨リストの表示と表示の順位が指定通りになっていることが確認できました。

Word_UI_スタイルを登録
図17 List3の実行結果

4. まとめ

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

今回はMS-OfficeのWordを操作するライブラリとして「python-docx」によるスタイルの書式を設定する、カスタマイズする方法について解説してきました。

ドキュメントは見た目が重要です。スタイルの書式をうまく活用することで統一感と見栄えを整えていきましょう。本記事が何かのお役に立てれば幸いです。

最後にポイントをまとめておきます。

➀. 段落、文字、表にスタイル(Styleオブジェクト)を設定することができる。さらに、スタイルにはライブラリに予め組み込まれた(built-in-Style)と独自に定義・追加する(Custum-Style)の2種類がある。

➁. built-in-Style段落36種、文字27種類、表100種類と豊富に用意されている。

➂. Custum-Styleは、built-in-Styleをベースとして継承しつつもオリジナル書式を定義することができる。また、Wordへの登録とUIの一覧表示をコード上で行うことができる。

本連載は今回が最後ですが、また機会があればpython-docをつかった応用例を紹介したいと思います。お楽しみに。

また、Word以外にも「Excel」や「PowerPoint」を操作するためのライブラリも連載記事で解説しています。 Office3大ソフトとPythonを組合わせて作業効率を上げていきましょう!

〇Excelの連載についてはこちらから

〇PowerPointの連載についてはこちらから

ここまで、お読みいただきありがとうございました。

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