kakakakakku blog

Weekly Tech Blog: Keep on Learning!

python-docx を使って Python でリッチな Word ドキュメントを作る

python-docx を使うと Python で Word ドキュメントを操作できる.新しく Word ドキュメントを作ることもできるし,既存の Word ドキュメントから文章を抽出することもできる.前に紹介した python-pptx と関連している.最近 PowerPoint の文章を Word に繰り返しコピーする機会があり,作業効率を上げるために python-pptxpython-docx を組み合わせた自動化コードを実装していた.

github.com

python-docx : サンプルコードを実行する

python-docx のドキュメントにサンプルコードが載っている.実装されている機能をザッと箇条書きにすると以下のようになる.

  • 見出し
  • 段落
  • 文字スタイル(太字 / イタリック)
  • 箇条書き
  • 段落番号
  • 画像
  • テーブル
  • 改ページ

python-docx.readthedocs.io

さっそく python-docxpip install してからサンプルコードを実行すると,以下のような demo.docx を作れた!スゴイ!便利!なお,画像を埋め込む実装で monty-truth.png は存在しないため cat.jpg にした.

f:id:kakku22:20201216164902p:plain

サンプルコードも載せておく.

from docx import Document
from docx.shared import Inches

document = Document()

document.add_heading('Document Title', 0)

p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')

document.add_paragraph(
    'first item in unordered list', style='List Bullet'
)
document.add_paragraph(
    'first item in ordered list', style='List Number'
)

document.add_picture('cat.jpg', width=Inches(1.25))

records = (
    (3, '101', 'Spam'),
    (7, '422', 'Eggs'),
    (4, '631', 'Spam, spam, eggs, and spam')
)

table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

document.add_page_break()

document.save('demo.docx')

python-docx : 他の機能も試す

サンプルコードには入っていなかった他の機能もドキュメントを読みながら試す.

  • テンプレート
    • Document オブジェクトに Word ドキュメントを指定するとテンプレートに書き込める
  • ヘッダー
    • Section オブジェクトから header プロパティにアクセスできる
  • 文字スタイル(サイズ / フォントスタイル)
    • Paragraph オブジェクトから font プロパティにアクセスできる
  • フッター
    • Section オブジェクトから footer プロパティにアクセスできる

今回は「青背景」のテンプレートを作って,Impact フォント(サイズ 50)で「kakakakakku blog」と書き出す.さらに「ヘッダー」「フッター」も書き出す.コードも直感的に読みやすくそこまで違和感なく実装できる.

from docx import Document
from docx.shared import Pt

document = Document('template.docx')
section = document.sections[0]

header = section.header
paragraph = header.paragraphs[0]
paragraph.text = '/// This is Header'

p = document.add_paragraph().add_run('kakakakakku blog')
font = p.font
font.name = 'Impact'
font.size = Pt(50)
font.bold = True

footer = section.footer
paragraph = footer.paragraphs[0]
paragraph.text = '/// This is Footer'

document.save('demo.docx')

コードを実行して demo.docx を開くと以下のようになった(フッターは隠れている).おお!これは便利!

f:id:kakku22:20201216164925p:plain

まとめ

python-docx を使うと Python で Word ドキュメントを操作できる.Word ドキュメントを直接作るのではなく,プログラムから間接的に操作したいときに使える.最近たまたま PowerPoint の文章を Word に繰り返しコピーする機会があり,作業効率を上げることができた.

python-pptx 関連記事

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com