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で公開しています。
エントリ内では紹介しきれなかった内容も含まれていますので、そちらも併せて参照していただけたら幸いです。
ディスカッション
コメント一覧
まだ、コメントがありません