OfficeをPythonで(4)
Wordドキュメントの場合
(ヘッダーとフッター)

どもです。

前回まで3回にわたって、PythonとopenpyxlでMicrosoft OfficeのExcelを操作してきました。
この3回の記事で、「滅多に行わないが、しかしいざ手動で実施すると時間がかかってしまう操作」の代表として、以下の操作を自動化してみました。

  • アクティブなセル/シートを各ファイル/各シートで統一する
  • 表示モードを各ファイル/各シートで「標準」に統一する
  • 各ファイルのシート数をカウントする
  • 各ファイル/各シートのページレイアウトを1×1に設定する
  • 各ファイル/各シートのヘッダー/フッターを設定する

そこで今回は、対象とするMicrosoft Officeのアプリケーションを「Excel」から「Word」に変更し、やっぱり「滅多に行わないが、しかしいざ手動で実施すると時間がかかってしまう操作」を自動化してみます。

0. 開発環境

引き続き、以下の環境で操作を行います。

開発環境
項目 バージョン
python 3.10.2
python-docx 0.8.11
Word 2013

python-docxは、pythonでMicrosoft Office Wordファイルを操作するためのライブラリです。

余談ですが、Excelを操作するためのライブラリとして、「python-xlsx」も存在します。
このライブラリを触る予定は、現在はありません。
機会があれば、別のエントリで投稿します。

1. いじってみる

今回は、このリストの項目のうち、

「各ファイル/各シートのヘッダー/フッターを設定する」

を実施してみます。

2. ヘッダーに文字列を設定する

WordのヘッダーにpythonからWordのヘッダーに文字列を設定するためには、以下の属性/関数を操作します。

  • class docx.section._Header.add_paragraph()

詳細は、公式のドキュメントに任せることにします。
本エントリでは、この関数の使い方について書きます。

2.1. オブジェクトの取得

_Headerオブジェクトは、以下の手順で取得します。

document = Document(path)
sections = document.sections
section_header = sections[0].header

python-docxでは、ヘッダーは「Document」オブジェクトの「sections」属性の「header」属性から取得します。
ここで、「Document」オブジェクトはWordファイルに対応しています。
また、「sections」属性は「Section」オブジェクトの"Sequence"(英語で、「連続した一連のモノ」の意味…の様子)です。
この「Section」オブジェクトはページ設定や「ヘッダー」、「フッター」へのアクセス方法を提供します。

紹介したコードでは、先頭の「Section」オブジェクトを取得し、そこから「header」属性にアクセスすることで、「_Header」オブジェクトが取得可能です。

2.2. 文字列の設定

次に、ヘッダーに対する文字列の設定です。

ヘッダーに文字列を設定するためには、前出の通り「add_paragraph()」メソッドを使用します。
具体的には、以下のコードで設定可能です。

section_header.add_paragraph(header_item)

ここで「header_item」が、実際にヘッダーに設定したい文字列を示します。

2.3. 問題点

前章で示したコードでは、実は問題点があります。
それは、

実行する度にヘッダーに文字列が追加される

ということです。

「add_paragraph」関数はその名の通り、「段落(paragraph)」を「追加(add)」する関数です。
そのため、既にヘッダーに文字列が設定されていた場合、指定された文字列を「新しい段落」として追加します。

2.4. 問題の解決

この問題を解決するためには、

既存のヘッダーの文字列を一度削除する

という方法があります。
具体的には、ヘッダーを設定する前に、以下のコードを実行します。

paragraphs = header_section.paragraphs
for paragraph in paragraphs:
	element = paragraph._element
	element.getparent().remove(element)
	paragraph._p = paragraph._element = None

これにより、ヘッダーの内容を全て削除することができます。

3. ヘッダーにアライメントを設定する

前章で、ヘッダーに文字列が設定できたので、次に「アライメント」を設定します。

3.1. コード(右寄せの場合)

ヘッダーのアライメントを設定するためには、「paragraph」オブジェクトの「alignment」属性に値を設定します。
例えば、「右寄せ」にする場合には、以下のコードを実行します。

paragrah.alignment = WD_ALIGN_PARAGRAPH.RIGHT

3.2. アライメントの種類と動作

python-docxで設定可能なアライメントの値とWordでの設定の対応は、下表のようになります。

設定項目 Wordの設定
LEFT 左揃え
CENTER 中央揃え
RIGHT 右揃え
JUSTIFY 両端揃え
DISTRIBUTE 均等割り付け
JUSTIFY_MED ???
JUSTIFY_HI ???
JUSTIFY_LOW ???
THAI_JUSTIFY ???

実際にpython + python-docxでこれらのアライメントを段落に設定すると、以下のような結果になります。



で示した項目のうち、「Wordの設定」が「???」となっている設定(「JUSTIFY_MED」~「THAI_JUSTIFY」)について、Wordではどのような値として認識、表示されるか確認します。
各段落(paragraph)の「段落」画面を表示すると、以下のような画面が表示されます。



アライメントに対応する「配置」の設定欄が、空欄になっています。
私の使っているWordが古い、かつ日本語版と、要因が複数あるため断定はできませんが、どうやらこれらの設定には対応していない様子です…。

4. まとめ

今回は、pythonとpython-docxを使用して、Wordファイルをいじってみました。
いじった内容は、

  • ヘッダーの文字列
  • ヘッダーのアライメントの設定

と、シンプルな内容です。
それでも、これまでExcelに対して行った操作と同じことができるようになりました。

本エントリの内容が、少しでも誰かの助けになれば幸いです。

ではっ!

ex. 公開しています。

今回のエントリで紹介したコードの完全版(全コード)は、GitHubで公開しています。
エントリ内では紹介しきれなかった内容も含まれていますので、そちらも併せて参照していただけたら幸いです。