パープルハット

※当サイトではGoogleアドセンス広告を利用しています

Python Wordの表に画像を挿入



概要

  • 理系学生が論文執筆するとき、実験や研究の結果画像をまとめてWordに張り付けることが良くあると思います。
  • 画像が数枚であれば貼り付けに苦労しませんが、何十枚もある場合はかなり面倒になります(位置・大きさの調整など...)。
  • そこで、本記事ではPythonのdocxライブラリを使用してこれを自動化する方法を紹介します。(↓こんな感じのモノを作成)
input.docx(処理前) 処理前
output2.docx(処理後) 完成品



パッケージのインストール

Python Docx :: Anaconda.orgを参考に、以下のコマンドを実行してpython-docxをインストール

conda install conda-forge::python-docx



docxを使用した画像の挿入

  • 画像は表に挿入すると見やすく整列されるので、これをPythonで自動化します。

解説詳細

インポート

import docx
from docx.shared import Mm //画像などの大きさをミリ単位で設定できるようにする
from docx.enum.text import WD_ALIGN_PARAGRAPH //中央揃えするときに使用


ファイルの読み取り

#ファイル名を指定して読み込み
doc = docx.Document('input.docx')


操作したいテーブルの取得

  • 表の枠線をなくしてもWord上だと点線で表示されますが、pdfなどに出力したときは消えます。
# 該当する番号の表を取得して、枠線をなくす
table = doc.tables[0]
table.style = 'Normal Table'


操作したいテーブルの取得

  • リストなどと同じように文書内の最初の表が0番、それ以降は1, 2, 3, ..., n番目となります。
  • 表の枠線をなくしてもWord上だと点線で表示されますが、pdfなどに出力したときは消えます。
# 該当する番号の表を取得して、枠線をなくす
table = doc.tables[0]
table.style = 'Normal Table'


セルの取得

  • rowsが縦方向、cellsが横方向に何番目かを示します。
p1 = table.rows[0].cells[0].paragraphs[0]
p1.alignment = WD_ALIGN_PARAGRAPH.CENTER // 中央揃え


画像の挿入

r1 = p1.add_run()
r1.add_picture('square.png', Mm(20)) //第一引数が画像のパス、第二引数が大きさ


テキストの挿入

  • 画像挿入の時と同様にします。
p2 = table.rows[1].cells[0].paragraphs[0]
p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
p2.text = "(a)square"


ファイルの保存

doc.save("output1.docx")



完成したコードと実行結果

ソースコード

import docx
from docx.shared import Mm
from docx.enum.text import WD_ALIGN_PARAGRAPH

#ファイル名を指定して読み込み
doc = docx.Document('input.docx')
    
# 該当する番号の表を取得して、枠線をなくす
table = doc.tables[0]
table.style = 'Normal Table'

# セル(0, 0)を選択して中央揃えにする
p1 = table.rows[0].cells[0].paragraphs[0]
p1.alignment = WD_ALIGN_PARAGRAPH.CENTER

# サイズ指定して画像挿入
r1 = p1.add_run()
r1.add_picture('square.png', Mm(20))

# 同様にセル(0, 1)を選択して中央揃えにする
p2 = table.rows[1].cells[0].paragraphs[0]
p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
p2.text = "(a)square"

#保存
doc.save("output1.docx")


実行結果

output1.docx


複数枚の画像で実践

  • 本記事の目的は複数枚の画像で行うことでしたので、for文を使いこれを実現します。
  • 完成すると、最初に示したような画像が出ます。
import docx
from docx.shared import Mm
from docx.enum.text import WD_ALIGN_PARAGRAPH

#ファイル名を指定して読み込み
doc = docx.Document('input.docx')

# 表番号と挿入したい画像名リストの辞書
img_dict = {
    0: {'circle.png', 'hurt.png', 'moon.png', 'square.png'},
    1: {'star.png', 'triangle.png'},
}

# ループ
for n, imgPaths in img_dict.items():
    
    # 該当する番号の表を取得して、枠線をなくす
    table = doc.tables[n]
    table.style = 'Normal Table'

    # 画像&図名を挿入
    for index, imgPath in enumerate(imgPaths):

        # 画像
        p1 = table.rows[2 * (index // 2)].cells[index % 2].paragraphs[0]
        p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
        r = p1.add_run()
        r.add_picture(imgPath, Mm(20))

        # 図名
        p2 = table.rows[1 + 2 * (index // 2)].cells[index % 2].paragraphs[0]
        p2.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p2.text = imgPath

#保存
doc.save("output2.docx")