【Python×Word】python-docxで「画像・テーブル・セクション」を管理する方法

スポンサーリンク
Python外部ライブラリ(python-docx)画像・表・ページ設定の基本 Python

MS-Office 「Word」をPythonで操作する「python-docx」ライブラリを解説します。

Wordでできることは、「文章を作成する」こと以外にも、「画像・図・表を挿入する」「ヘッター/フッターを設定する」「スタイルを定義する」など多岐にわたります。そのため、次の目次のようにテーマごとに複数回の連載記事として解説しています。

<連載 Python×Word 目次 >
  • 連載1】ライブラリの導入とドキュメント(本文)作成の基本について >>
    1. python-docxのオブジェクトの階層構造 >>
    2. 段落による文章の管理 >>
    3. 文字ごとの書式設定 >>
  • 【連載2】ドキュメントに画像やテーブル・セクションを導入する >>
    1. 画像をインライン挿入する >>
    2. テーブルを挿入する >>
    3. セクションでドキュメント構成を管理する >>
  • 【連載3】スタイルの活用と登録する方法 >>
    1. 組込みスタイルを適用する >>
    2. 段落のスタイル >>
    3. 文字のスタイル >>
    4. テーブルスタイル >>
    5. ユーザー定義スタイルの登録 >>

連載2回目となる今回は、「Wordドキュメントに画像や表を挿入する方法」とセクションの活用事例として「ヘッダーとフッターを設定する」といった内容を解説します。

文章をメインコンテンツとするWordドキュメントですが、画像や表などを効果的に使うことで、訴求力や信ぴょう性を高めることができます。とりわけ論文・解説書など、公式でしっかりとしたドキュメントの場合は、必須コンテンツとなるでしょう。

また、大きな規模のドキュメントの場合は、ページ管理ユニットであるセクションの導入も検討する必要があります。

「python-docx」はこれらすべてのことに対応できます。

この記事を読むことで、次のようなことが「できるわかる」ようになりますので最後までお付き合いください。

この記事で学べること
  • 画像(InlineShapeオブジェクト)を段落に挿入する手順について
  • テーブルの定義(Tableオブジェクト)と挿入する手順について
  • ヘッダー・余白設定などページ管理に関わるSectionオブジェクトと関連属性について

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

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

それでは、次節より「python-docx」ライブラリの具体的な扱い方について、解説していきます。

スポンサーリンク

1. 画像をドキュメントに挿入する

本節では、ドキュメントに画像を挿入する手順について解説します。

画像は段落(Paragraphオブジェクト)に配置することができます。さらに段落を構成する文章(Runオブジェクト)中にも埋め込むこともできます。

python-docxではWordドキュメント内の画像やグラフはInlineShape(Picture)[Text Layer]であれば扱うことができますが、次の公式ドキュメントの記載にもあるとおりFloatingShape[Drawing Layer]はサポートされていません。

Inline(TextLayter)とは、段落や文章の一部に埋め込むという意味で、文字や画像どうしが行の高さや幅、改行などで互いに干渉し合う階層を指します。

一方、Floating(Drawing Layer)とは、段落と画像の配置レイヤが区別され、互いに干渉することなく、自由に画像や図形などを配置できます。

Understanding pictures and other shapes

At the time of writing, python-docx only supports inline pictures. Floating pictures can be added.  If you have an active use case, submit a feature request on the issue tracker.

https://python-docx.readthedocs.io/en/latest/user/shapes.html

また、大変残念ですが「python-docx」では、InlineShapeであっても図形・SmartArtの操作には対応していないようです。Floating(Drawing Layer)の対応と合わせて今後のアップデートに期待しましょう。

現状の画像や図形のサポート状況についてまとめました、参考にして下さい。(図1)

python-docx_InlineShapeとFloatingShapeの違い_まとめ_rev0.2
図1 Shapeオブジェクトの対応状況まとめ

補足として、図形やSmartArt[Inline/Floating Shape]を設定・取得する場合は次の2つの方法があります。目的に応じて「python-docx」と使い分けると良いでしょう。

  • 「pywin32ライブラリ」のShapeオブジェクトとして、取得と設定を行う。
  • WordドキュメントをXMLファイルに変換後、DOM構造の解析をしてオブジェクトを取得する。

それでは、次項より段落に画像を挿入するクラスやメソッド・属性を解説していきます。

1.1 段落(Paragraphオブジェクト)に画像を挿入する

段落に画像を設定することができます。新たに追加された段落に画像を挿入するだけであれば、Documentオブジェクト配下の add_picture()メソッド を次の書式のようにして使います。

Paragraphオブジェクト

Documentオブジェクト.add_picture(img_path, width, height)


引数: img_path : 画像ファイル名を指定 jpg/pngに対応/パス付きで指定

引数: width :画像の横幅を設定する(オプショナル引数) 

引数: height :画像の縦幅を設定する(オプショナル引数)

戻り値: InlineShapeオブジェクト

画像ファイルはjpg/pngフォーマット形式に対応、画像のサイズ指定をする width/height属性 があります(いずれもオプション)。単位は、mm(ミリ)やInche(インチ)などで指定しますが、省略した場合は元のサイズが適用されます。

また、片方のみを指定した場合は、同じアスペクト比で自動調整します。

SAMPLE(1)

それでは、サンプルコードによる実例を紹介します。

コードの概要は、add_picture()メソッドにより画像3枚を貼ります。新規段落が追加された上で画像が挿入される点に注目してください。

from docx import Document
from docx.enum.text import WD_ALIGN_PARAGRAPH # 段落位置の定義クラスをインポート
from docx.shared import Mm                    # 単位系や色が定義されているSharedクラス

doc1=Document()

# 段落"1"
p1 = doc1.add_paragraph('画像1(.png)を挿入します。')
# 段落"2" add_pictureメソッドpng画像(幅50mm)を挿入
doc1.add_picture('./picture/picture1.png', width=Mm(50))

# 段落"3" 
p3 = doc1.add_paragraph('画像2(.jpeg)を挿入します。')
# 段落"4" add_pictureメソッドjpec画像(幅50mm)を挿入
doc1.add_picture('./picture/picture2.jpg', width=Mm(50))

# 段落"5"
p5 = doc1.add_paragraph('画像3(.png)を挿入します。')
# 段落"6" add_pictureメソッドpng画像(高さ50mm)を挿入
doc1.add_picture('./picture/picture3.png', height=Mm(50))

print(len(doc1.paragraphs)) # >>6 段落の個数を調べる

for p_index in [0, 1, 4, 5]:
    
    # 画像はInlineShapeオブジェクトとして段落として認識され、alignmentプロパティ
    # で段落の開始位置を指定することで画像挿入位置を大まかに設定することができる
    doc1.paragraphs[p_index].paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER

doc1.save('段落に画像を挿入する.docx')

<List1>の実行結果は以下のようになりました。3つの画像が挿入され、段落の数はadd_picture()メソッドによって追加されたものも含めて6つとなっています。

また段落(Paragraphオブジェクト)の alignmentプロパティ で配置位置を中央合わせになることから、段落の書式が適用されることが確認できます。

add_pictureのコード例の実行結果➀
図2 List1の実行結果

1.2 文章の途中に画像を挿入する

文章の任意の場所に画像を挿入することもできます。文章(単語・文字)はRunオブジェクトで管理されていますが、add_picture()メソッド は、Runオブジェクトの配下にも提供されています。書式はParagraphオブジェクト配下のものと全く同じです。

Runオブジェクト

Documentオブジェクト.add_picture(img_path, width, height)


引数: img_path : 画像ファイル名を指定 jpg/pngに対応/パス付きで指定

引数: width :画像の横幅を設定する(オプショナル引数) 

引数: height :画像の縦幅を設定する(オプショナル引数)

戻り値: InlineShapeオブジェクト

使い方も、段落(Paragraph)直下に配置の場合と同様です。文章コンテンツと同列にInlineShapeオブジェクトが挿入されます。

SAMPLE(2)

ここでも、サンプルコードによる add_picture()メソッド の使用例を紹介します。

from docx import Document
from docx.shared import Mm

doc1=Document()

# 段落 "1"
p1 = doc1.add_paragraph(style='Title')

# 段落のRunオブジェクトのadd_pictureメソッドで文章の途中に画像を挿入する
p1.add_run().add_picture('./picture/picture1.png', width=Mm(15))
p1.add_run(' Runオブジェクトの ')

p1.add_run().add_picture('./picture/picture2.jpg', width=Mm(15))
p1.add_run(' add_pictureメソッドで画像挿入 ')

p1.add_run().add_picture('./picture/picture3.png', height=Mm(15))


doc1.save('文章中に画像を挿入する.docx')

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

‘Title’スタイルをもつ段落に対して、Runオブジェクトを追加しながら「文字」と「画像」を交互に挿入しています。

add_pictureのコード例の実行結果②
図3 List2の実行結果
スポンサーリンク

2. 表(テーブル)を挿入する

Python_基本文法_内包表記

ドキュメントに表(テーブル)を挿入することができます。

表はpython-docxではTableオブジェクトとして管理されています。TableオブジェクトはDocumentの add_table()メソッド を次の書式で取得します。

Tableオブジェクト

Documentオブジェクト.add_table(rows, cols, style)


引数:rows: 表の行数を指定する

引数:cols: 表の列数を指定する

引数:style: 表に設定するスタイルを指定する(オプショナル引数)

戻り値: Tableオブジェクト

表の行数・列数はぞれぞれ、引数:rows/cols に指定します。表全体の色合いやイメージは、組込みテンプレート(スタイル)を 引数:style に文字列で指定します。

組込みスタイルには、以下のようなものが用意されています。(図4)

Table styles_template
図4 テーブルの組込みスタイル一覧(一部抜粋)

Tableオブジェクトはさらに列(Column(s)オブジェクト)、行(Row(s)オブジェクト)、セル(Cellオブジェクト)で構成されています。(図5)

Tableオブジェクトは、行・列またはセルを要素とするコレクションであり、Columns/Rowsオブジェクトもまた、セルを要素とするコレクションです。

よって、上位のオブジェクトは下位の要素をイテラブルに取得することができます。

python-docx_Tableオブジェクトの構成_階層構造_rev0.2
図5 Tableオブジェクトの構成要素

Tableオブジェクト配下には関連メソッドやプロパティが多くあります。主要なものは以下があります。

Tableオブジェクト

列を右端に追加

Tableオブジェクト.add_column(width)

引数:width:列幅を指定する

戻り値: Columnオブジェクト / Columnsコレクションに追加する


行を下端に追加

Tableオブジェクト.add_row()

戻り値: Rowオブジェクト / Rowsコレクションに追加する


列のコレクション(Columns)を取得

Tableオブジェクト.columnsプロパティ

戻り値: Columnsコレクション

(columns[index]のように、特定の列をインデックス指定することも可能)


行のコレクション(Rows)を取得

Tableオブジェクト.rowsプロパティ

戻り値: Rowsコレクション

(Rows[index]のように、特定の行をインデックス指定することも可能)


セル(Cellオブジェクト)を取得

Tableオブジェクト.cell(row_idx, col_idx)

引数: row_idx: 取得セルの行番号を指定する   A1セルを(0,0)基準とする

引数: col_idx: 取得セルの列番号を指定する    A1セルを(0,0)基準とする

戻り値:Cellオブジェクト

その他、行(Row)・列(Column)・セル(Cell)オブジェクトに関する主な属性は以下のようなものがあります。Cellオブジェクトにはこの他にも多くの属性があります。

セルの中に、さらに段落(Paragraphオブジェクト)を追加して、本文と同様のことができます。

(詳しくは連載1回目の記事を参照下さい。)

行・列・セルのオブジェクト各種 】機能】【その他詳細
Columnオブジェクト.widthプロパティ列の幅を設定する
Rowオブジェクト.heightプロパティ行の高さを設定する
Cellオブジェクト.textプロパティセルに値を設定・取得する
Cellオブジェクト.add_paragraphs(text, style)段落を追加する本文の段落と同様の扱い
表1 行・列・セルオブジェクトの主要な属性

SAMPLE(3)

ここで、ドキュメントにテーブル(表)を設置するサンプルコードを紹介します。

コードの概要は、4行4列のセルを持つテーブルを定義した後、各Cellオブジェクトにアクセス・値やセルの書式を設定します。

from docx import Document
from docx.enum.table import WD_ALIGN_VERTICAL # セル内のは配置位置の定義
from docx.shared import Mm  # 単位系や色が定義されているSharedクラス

# 列のラベルの定義
col_names = ['氏名', '所属', '給与']

# データ内容の定義
data = [['芥川 龍之介', '総務部', '245000'],
       ['夏目 漱石', '経理部', '350000'],
       ['石川 啄木', '営業部', '298000']]

doc1 = Document()

#(A)---------------------------------------------------------------------------------------------------------------
# add_table()メソッドにより1行,3列のTableオブジェクトオブジェクトを取得する
tb1 = doc1.add_table(rows=1, cols=len(col_names), style='Colorful Shading Accent 1')

#(B)---------------------------------------------------------------------------------------------------------------
# 列名を1行目のセルに設定
for i, cell in enumerate(tb1.rows[0].cells): # CellsプロパティでCellオブジェクトのコレクションを取得
    cell.text = col_names[i]                  # Cellオブジェクトのtextプロパティで値を設定

#(C)---------------------------------------------------------------------------------------------------------------
# 行(Rowオブジェクト)を追加しなあら、セルに値を設定
for d in data:
    row = tb1.add_row()   # Rowオブジェクトの追加
    row.height = Mm(8.0)  # heightプロパティで行の高さを8mmに指定
    
    for i, cell in enumerate(row.cells): # Cellオブジェクトの取得
        cell.text = d[i]                  # Cellオブジェクトのtextプロパティで値を設定
        cell.vertical_alignment = WD_ALIGN_VERTICAL.BOTTOM  # vertical_alignmentプロパティにてセル内の配置位置を設定

#(C)---------------------------------------------------------------------------------------------------------------
# 列(Columnオブジェクト)の追加 
tb1.add_column(Mm(15.0))       # 幅15㎜の列を追加
print(tb1.columns[3].width.mm) # >>14.993

tb1.cell(0, 3).text = '備考'   # 追加列のタイトルを設定


doc1.save('テーブルを挿入する.docx')

それでは、ポイントを解説します。

6,9行目でテーブルのデータセットをリストで用意します。

17行目:【Tableオブジェクトの追加】

add_table()メソッド で1行3列のTableオブジェクトを用意します。引数:style に組込みテーブルスタイルを設定します。Tableオブジェクトはこの後の処理に使うので変数tb1に格納します。

21,22行目:【列ラベルをセルに設定】

cells属性 をFor文句で展開してCellオブジェクトを取得します。text属性 で各セルにラベルを設定します。

26~28行目:【行(Rowオブジェクト)を追加】

必要なレコード分の行(Rowオブジェクト)を add_row()メソッド で追加します。また、height属性 で行の高さを指定します。

30~32行目:【セルに値を設定】

RowオブジェクトからFor文句でCellオブジェクトに展開、リストの値を設定します。

同時に、vertical_alignment属性 でセル内の配置を下限に指定します。

最後に、add_column()メソッド でColoumnオブジェクトを追加して「備考」ラベルを設置して、4×4のテーブルを完成させます。

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

スタイルやサイズや幅・高さなどのディメンジョンが指定したものとなり綺麗なテーブルを挿入することができました。

Tableオブジェクトのサンプルコード実行結果
図6 List3の実行結果
スポンサーリンク

3. セクション(ページ管理)を導入する

本節ではセクション設定によるページ管理について解説していきます。python-docには、セクション機能も用意されています。

3.1 セクションとは

Wordにおける「セクション」とはページサイズや余白、用紙の方向、ヘッター/フッターなどの設定をページごとまたは、ページ範囲ごとに管理するユニットのことです。

例えば、図7ではWordファイル全7ページに3つのセクション(A,B,C)に分類してページ設定を管理している場合です。ページ範囲ごとに、ヘッタ・フッタ情報や用紙の方向などのページ情報を設定・変更することができます。

セクションの概要
図7 Wordにおけるセクション

python-docxではセクションを Sectionオブジェクト で管理しています。

3.2 セクション(Sectionオブジェクト)の取得と設定

Sectionオブジェクトの新規追加および既存のオブジェクトの取得にはDocumentオブジェクト配下のadd_section()メソッドsectionsプロパティ を使います。

Sectionオブジェクトの取得

セクションの新規追加

Documentオブジェクト.add_section(start_type)

引数:start_type: 追加するセクションの種類を「WD_SECTION_STARTクラス」から指定する

戻り値: Sectionオブジェクト


セクションの取得

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

戻り値: Sectionオブジェクトのコレクション

add_section()メソッド引数:start_type には WD_SECTION_STARTクラス で定義されているEnumから指定します。Word UIとの対応関係は図8の通りです。

(Word -> “レイアウトメニュー” -> “ページ設定タブ” -> “区切り”)

WD_SECTION_STARTの種類
図8 セクション区切りの種類

Sectionオブジェクトの関連属性によってセクションごとに「ページ設定」を細かく指定できます。

Word UIの「ページ設定ダイアログ」上の設定項目がどの属性に対応するのかについては以下を参照ください。

ページ設定(余白)

Sectionオブジェクトのプロパティ②
図9 Sectionオブジェクト<余白の設定>

ページ設定(用紙)

Sectionオブジェクトのプロパティ➂
図10 Sectionオブジェクト<用紙設定>
Sectionオブジェクトのプロパティ➀
図11 Sectionオブジェクト<セクション開始位置、ヘッター/フッタ>

ここでSectionオブジェクトについて、一つ注意点があります。一つのドキュメントの中に複数のSectionオブジェクトを定義することができますが、デフォルト設定では、これらは全て継承(互いにリンクされた)関係にあります。

つまり、現在のセクションが、一つ前までのセクション定義情報をもつことになり、意図通りの設定にならないことがあります。

それを防ぐためには、次の is_linked_to_previousプロパティ で明示的に継承関係を切る(Falseを設定)必要があります。(※Trueではないので注意して下さい。)

Sectionオブジェクト

セクションの継承

Sectionオブジェクト.is_linked_to_previousプロパティ

True: 前のセクション情報を継承する

False: 現行セクションの設定を反映する

セクションの活用事例として次項では「ヘッダー/フッター」を適用する方法を取り上げます。

3.3 セクションの活用(ヘッダー、フッター設定する)

セクションを活用する目的に、ページの「ヘッダー、フッター」の設定にあることは多いと思います。本項では、「ヘッダー、フッター」設定の具体例を紹介します。

ヘッダー(Headerオブジェクト)とフッター(Footerオブジェクト)は、Sectionオブジェクトの

headerプロパティfooterプロパティ で取得します。

_Header/_Footerオブジェクト

Sectionオブジェクト.headerプロパティ

戻り値: _Headerオブジェクト


Sectionオブジェクト.footerプロパティ

戻り値: _Footerオブジェクト

取得した _Header(_Footer)オブジェクトに対してコンテンツを追加するには、本文作成の時と同じように add_paragraph()メソッド で段落(Paragraph)を追加します。本文の文章作成については<こちら>を参考にして下さい。

その他、ヘッダー(フッター)に関する主なメソッド・属性は以下のとおりです。

_Header(_Footer)オブジェクト機能その他詳細
add_paragraph(text, style)メソッド段落を追加するParagraphオブジェクト
add_table(rows, cols, width)メソッドテーブルを追加するrows:行数, cols:列数, width:横幅
is_linked_to_previousプロパティ直前のヘッダー(フッター)情報の継承の可否True:有効/False:無効
表2 _Header(_Footer)オブジェクト配下の主なメソッド・属性

SAMPLE(4)

Sectionオブジェクトを使ったコード例を1つ紹介します。

ページの書式設定(用紙サイズ・余白・印刷の向き)とヘッター、フッターをセクション毎に確認・設定しています。

from docx import Document
from docx.enum.section import WD_SECTION

from docx.shared import Mm  # 単位系や色が定義されているSharedクラス
from docx.enum.section import WD_ORIENT # ページの向きが定義されているenumrationsクラス

from docx.enum.text import WD_ALIGN_PARAGRAPH


# ドキュメントを新規作成する
doc1 = Document()

# 現在のセクションを取得するにはsectionsプロパティに[-1]を付加する
sec1 = doc1.sections[-1]

# start_typeプロパティで現在のセクションタイプを調べる
# 新規作成されたドキュメントにはデフォルトで1つセクション(NEW_PAGE)を持っている
print(sec1.start_type) # >>NEW_PAGE (2)

#-------------------------------------------------------------------------------------
# セクション1のページの書式を調べる

# セクション1のページ設定(ページの向き、ページの幅、ページの高さ)を取得する
print(sec1.orientation, sec1.page_width.mm, sec1.page_height.mm) # >>PORTRAIT (0) 215.9 279.4

# セクション1のページ設定(ページの余白(左),ページの余白(右))
print(sec1.left_margin.mm, sec1.left_margin.mm) # >> 31.75 31.75

# セクション1のページ設定(ページの余白(上),ページの余白(下))
print(sec1.top_margin.mm, sec1.bottom_margin.mm) # >> 25.4 25.4

#-------------------------------------------------------------------------------------
# セクション1のヘッター・フッターを設定する

# headerプロパティでHeaderオブジェクトを取得する
hd1 = sec1.header

# Headerオブジェクトのadd_paragraph()メソッドで段落を追加する
hd1_pg = hd1.add_paragraph('CONFIDENTIAL_マル秘')

# footerプロパティでFooterオブジェクトを取得する
ft1 = sec1.footer

# Headerオブジェクトのadd_paragraph()メソッドで段落を追加する
ft1_pg = ft1.add_paragraph('株式会社 Pythonでもっと自由を')

# 段落の位置を右端に設定する
ft1_pg.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.RIGHT


#-------------------------------------------------------------------------------------
# セクション2を追加してページの書式を設定する

# add_section()メソッドで新規セクション(NEW_PAGE)を追加する
sec2= doc1.add_section(WD_SECTION.NEW_PAGE)

print(sec2.start_type) # >>NEW_PAGE (2)

# orientationプロパティで印刷の向きを横向きに変更する
sec2.orientation = WD_ORIENT.LANDSCAPE

# セクション2の横幅を設定する
sec2.page_width = Mm(279.4)

#  セクション2の縦幅を設定する
sec2.page_height = Mm(215.9)


#-------------------------------------------------------------------------------------
# セクション2のヘッター・フッターを設定する

hd2 = section_new.header
ft2 = section_new.footer

# is_linked_to_previousプロパティで前のセクションのヘッター・フッター
# を引用するかを選択することができる

hd2.is_linked_to_previous = False # セクション1のヘッターを引用しない

ft2.is_linked_to_previous = True # セクション1のフッターを引用する

doc1.save('ヘッター・フッター.docx')

それでは、ポイントを解説します。

14行目:【新規ドキュメントのセクション】

sectionsプロパティ でドキュメント内にある全てのSectionオブジェクト(コレクション)を取得しています。インデックスによる指定で[-1]とすることで現在のページのSectionオブジェクトを個別に取得できます。(今回のように新規作成されたドキュメントの場合は、予め1つセクション(NEW_PAGE)が用意されています。)

24,26,30行目:【ページの書式設定の確認】

Sectionオブジェクトの属性により、ページの書式情報を確認しています。orientation属性 でページの向き、page_*属性 でページサイズ、そして、*_margin属性 で余白の確認をしています。

単位は mm属性 でミリメートルに変換しています。

36~48行目:【ヘッダー/フッターの設定】

Sectionオブジェクトに対しヘッターとフッターの設定をしています。

オブジェクトの取得にはそれぞれ header属性footer属性 により行います。コンテンツは本文の文章と同様に段落(Paragraphオブジェクト)で管理されいます。複数の段落を構成できますし、その他の用法も同じ扱いです。

55~66行目でセクションをもう一つ追加しています(変数sec2)。タイプを「NEW_PAGE」にしているので、2ページ目以降にこのセクションが適用されます。

72~80行目:【2つ目のセクションを適用】

2つめのセクション(sec2)のヘッター・フッターの設定をしています。

複数のセクションが存在している場合に重要になってくるのが、セクション間の継承(リンク)関係です。

is_linked_to_previous属性 で、一つ前のセクションのヘッター・フッターを引用するかを選択することができます。この例では、ヘッターは「False」とし引用させない(sec2を適用させる)、フッターは「True」とし前のフッター情報を引用するように設定しました。

※混同しやすいので注意してください。

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

ページの書式設定(用紙サイズ・余白・用紙の向き)とヘッター、フッターがセクション(ページ)ごとに設定できています。

  • 1ページ目(セクション1):ヘッター/フッター有、縦向き
  • 2ページ目(セクション2):フッター(セクション1をリンク)、横向き
セッションの使い方コードの実行結果
図12 List4の実行結果

4. まとめ

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

今回は「python-docxライブラリによる、画像・テーブル(表)の挿入、それからセクションによるページ管理する方法について解説してきました。

Wordのメインコンテンツはあくまで本文(文章、テキスト)ではあるのですが、図・表を用いることにより、訴求力や信ぴょう性を高めることができます。

とりわけ、論文・解説書など、公式でしっかりとしたドキュメントでは尚更です。

また、セクション管理を自動化することで

「一度に大量のドキュメントの編集が必要」になった場合、「python-docx」を活用することで一括処理を可能とします。

ぜひ、貴方のWord作業の効率改善にPythonをお役立てください

最後に今回の記事のポイントをまとめておきましょう。

. python-docxで画像を挿入することができる。Word自体は画像は2つのレイヤーに挿入可能であるが、このライブラリが対応できるのは行内(Inline Layer)のみである。Drawing Layerの画像に対応するには別のライブラリや方法を試行する必要がある。

. 表(Tableオブジェクト)を作成しドキュメント内に追加することができる。スタイルをはじめ各種属性が充実しており見栄えを整えることができる。

. ページの書式設定やフッター・ヘッターの管理はSectionオブジェクトで取得・設定できる。

. python-docxでは、図形、スマートアートを操作することはできないため、この場合も別のライブラリや方法を試行する必要がある。(今後のアップデートを望む)


さて次回は、ドキュメントにスタイルを適用する方法について解説します。

Wordで文章を作成する目的は様々です。「公的でフォーマルな文章」であったり「論文口調なかっちちとした文章」または「内々の親しげな口語口調」・・・

このように目的に応じて、事前にある程度文章のスタイル(フォント、見出し、ヘッター)、書き方が決まっているのが普通です。

このように「文章の型」を定型スタイルとしてWordに登録しておけば、繰り返し利用ができて効率的です。

次回は、このスタイル機能の活用方法を解説します。どうぞ、お楽しみに!

リンク先はこちらになります。↓

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

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