0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

python-docxでワードのヘッダー、フッターを各セクションごとに違う値にする

Posted at

はじめに

ワードの文書作成の自動化というのは、結構あるあるだと思う。
筆者はpythonを主に使用するので、python-docxで自動化するかーと軽い気持ちでやっていたが、思ったより大変だったので、今回躓いた内容を記しておく

ちなみに、公式ドキュメントを自分で漁れる、または躓いたところなんてオプションをちゃんと見れば解決できるっしょ!という、つよつよエンジニア向けではないのであしからず...当方、社会人になってからプログラムをやっている雑魚エンジニアなので、公式ドキュメントを見てばっちり分かるタイプではないんや...

躓いた内容

ワードの文書でヘッダー、フッターというのがある。主にページ数とかを書くものである。
今回は、そのフッターに各ページごとに違う文字を入れたい!と思っていたが、とりあえず作ったものでは全く機能しなかった。
すべてのフッターの値が、最後に更新した値になっていたのである。

解決策

解決した際のコードを貼っておく

import docx  # python-docxのインポート

# 新しいワードの作成
doc = docx.Document()
section = doc.sections[-1]  # 最後のセクションを取得

for footer_text in ["a", "b", "c"]:
    # 新しいセクション(ページ)の追加
    section = doc.add_section(docx.enum.section.WD_SECTION.NEW_PAGE)
    
    # フッターの指定
    footer = section.footer

    # 前セクションとのリンク切り離し
    footer.is_linked_to_previous = False

    # フッターへ文字を入力
    footer.paragraph[0].text = footer_text

doc.save("hoge.docx")

重要なのは新しいセクションの追加と、前セクションとのリンクの切り離しになっていて、
そもそも新しいセクションでないと、ヘッダー・フッターの値はすべて同一になってしまうし(これはワードを実際に手で動かしてもそうなる)、リンクの切り離しをしないとやっぱり同一の値になってしまう。

おわりに

今回は、python-docxのヘッダー、フッターというとても狭い領域の内容だったが、日本語で探しても解答が出てこないな...という印象。だいたい「フッターに任意の文字を入れる!」といった基本内容しか書いていなく、英語で探さないと出てこない。
公式ドキュメントも、質問内容で検索したって望むオプションとかはわからないので、stackoverflowとかで検索して使えそうなオプションを試す、を繰り返して見つけた...

chatGPTにも聞いたが、python-docx系のかなり踏み込んだ仕様には解答できていない印象。英語で聞けば違ったかもしれない

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?