Python外部ライブラリ(python-docx)で『Word』を操作して文章を作成する

スポンサーリンク
Python外部ライブラリ(python-docx)ドキュメント作成の基本 python-docx

<本サイト「Pythonでもっと自由を」のコンセプト>

本サイトは現在の人気No.1プログラミング言語Pythonをつかって作業を自動化効率アップしましょうという次のようなコンセプトを基にさまざまなライブラリ(モジュール)を紹介していきます。

➀Pythonという言語にはこれらの私たちの身近なアプリケーションを自動化してくれるさまざまな ライブラリ・モジュールが提供されている。

➁Pythonを使うことで、これまでに、何時間もかけていた作業が数秒で終わらせることもできるかもしれない。


ビジネスシーンで一番よく使われるアプリケーションといえば、、真っ先に思い浮かべるものとしてはMS-OfficeのExcelやWord、PowerPoint、Outlook・・・あたりなのではないでしょうか?

Officeソフト群
図1 ビジネスシーンで多用されるOfficeソフト

毎日使う必須ツールだからこそ、これらに関わる作業の効率向上や自動化を図ることへの効果は大きいと言えます。おそらく読者の皆さんもPythonをつかってこれらのことは実現できないか興味が少なからずおありだと思います。

安心してください、そこは人気No1言語Pythonです、ぬかりはありません。これら、アプリケーションを操作するためのライブラリがPython標準もしくは外部(サードバーティー)ライブラリとして用意されています。


今回の記事ではMS-Officeのドキュメント作成ソフトWordをPythonで操作する方法を紹介していきたいと思います。

Wordでできることは「文章を作成する」、「画像・図・表」を挿入する、「ヘッターフッター」を設定するなど多岐にわたりますが、本記事ではWordファイルの基本操作と「文章を作成する」の部分を取り上げていきます。図2 本記事の解説範囲

本記事の所掌範囲
図2 本記事の解説範囲

この記事を読むことで主に、次のようなことが「できる・わかる」ようになります。

➀ python-docxライブラリによるWordファイルの操作の基本について

➁ 文章作成に関連したオブジェクトの階層構造

➂ 段落(Paragraphオブジェクト)と文字(Runオブジェクト)の基本操作

スポンサーリンク

1. Wordを操作するライブラリ(python-docx)

PythonからWordを操作する機能を提供するライブラリには「pywin32」と「python-docx」の2つがあります。ともにPython標準ライブラリではなく外部ライブラリ(サードパーティ)として提供されていますが、次のような特徴や違いがあります。

pywin32: Wordに限らずOffice系ソフト全般の操作を可能とします。使われるクラスやメソッドなどはWindowsに準拠したプログラミング言語であるC#やVBA(Visual Basic for Application)のそれと類似した構成になっています。

コーディングにはOfficeディベロッパーセンターのリファレンスが参考になります。

pywin32とOfficeディベロッパーセンターの詳細については次の公式サイトを参照してください。

Pywin32公式ドキュメントの引用

https://pypi.org/project/pywin32/

OfficeディベロッパーセンターVBAリファレンスの引用

https://docs.microsoft.com/ja-jp/office/vba/api/overview/

python-docx:Wordの操作に特化したPythonライブラリです。pywin32とは異なりクラスやオブジェクトは他言語との互換性はありません、したがって、ある程度VBAの知識がある場合はpywin32をお勧めします。ただし、このpython-docxを使うメリットとして比較的コードが単純で直感的に理解しやすいと言えるでしょう。

python-docx公式ドキュメントの引用

https://python-docx.readthedocs.io/en/latest/

まとめると、

細かい所まで手が届く何でもできるのは、”pywin32”

「Wordに特化した専用ライブラリとして容易にコードが書けるのが”python-docx”」

とある程度使い分けることができますので参考にして下さい。

本記事では、「python-docxライブラリ」について解説をしていきます。

1.1 インストールと動作確認

次に「python-docx」のインストールと動作確認についてです。Anacondaには同梱されていないため、Pythonのライブラリ管理ツールの pipコマンド を使って以下のようにインストールしましょう。

pip install python-docx

Python-docxは使う目的によって様々なクラスを導入する必要があるのですが、まずは本体モジュールである docx から Documentクラス をインポートしましょう。

from docx import Document

この時点で実行しエラーメッセージが表示されなければインストール成功です。

2. python-docライブラリの基本的な使い方

Python_基本文法_内包表記

本節では、python-docライブラリの基本的な使い方を解説していきます。

オブジェクト指向を採用するpython-docでは、一つのオブジェクトには配下にさまざまな関数(メソッド)や属性(プロパティ)をもちあわせており、複数のオブジェクト間を連結・連絡させてWordファイルを操作していきます。

python-docを使ってWordドキュメントを作成するうえで、まず押さえておきたいことは、Wordを構成する要素に相当するpython-docxのオブジェクト階層構造を理解することです。

以下、図3は実際のWordドキュメントの構成要素に各種オブジェクトがどのような位置関係になるのかを示しています。

python-docxのオブジェクトの階層構造
図3 python-docxの主なオブジェクトの関係

Documentオブジェクト はいわば、Wordファイルそのものとなります。一般的に文章は複数の段落で構成されるのがふつうですが、一つの段落ごとに Paragraphオブジェクト が存在します。

Documentオブジェクトには複数のParagraphオブジェクトをもたせてコレクション(リスト)で管理されれています。

さらに、段落を構成する文字(単語)を一つ一つに Runオブジェクト が割り当てられ、これもまた一つのParagraphオブジェクトの中に複数のRunオブジェクトがコレクションとして管理されるという構成になります。

python-docxのオブジェクトの階層構造_その2

それでは、各種オブジェクトの扱い方を次項以降で詳しく解説していきます。

2.1 Wordファイルを読込む・新規作成する(Documentオブジェクトの取得)

Python-docxを使ってWordを操作するにはまず、Documentオブジェクト を取得する必要があります。DocumentオブジェクトはWordファイルそのものであってWordを構成する数多オブジェクトの最上位に位置します。

Documentオブジェクトを取得する方法は、「既存のWordファイルを読込む」または「新規アフィルを作成」する場合の2通りのパターンがあります。

いずれの場合も Document()メソッド を次の書式のように指定します。

Documentオブジェクト

import docx

docx.Document(filename)


引数1:filename:開く対象ファイル名を指定

戻り値:Documentオブジェクト

既存ファイルを読込み編集する場合は引数にファイル名(PATHを含めて)を指定し、新規作成する場合は引数なしでDocument()メソッドを実行します。

2.2 Wordファイルを保存(上書き/名前を付けて保存)する

Wordファイルを保存するにはDocumentオブジェクトの save()メソッド を次の書式のように指定します。

Documentオブジェクト

Documentオブジェクト.save (filename)


引数1:filename:保存ファイル名を指定

名前を付けて保存するもしくは別名を付けて保存する場合は引数にそのファイル名を指定しsave()メソッド実行します。上書き保存する場合は、Documentオブジェクトを読込んだ時と同じファイル名を指定を省略せずに指定します。

Documetオブジェクト_saveメソッド
図4 Documentオブジェクトの取得とsave()メソッド

例として、既存のファイルを読込んで、新規ファイルとして別名を付けて保存するコードは次のようになります。

# docxライブラリからDocumentクラスをインポート
from docx import Document

# Documentクラスの引数に読込むファイルを指定してインスタンスを生成
doc = Document('sample1.docx')

# Documentオブジェクトであることを確認
print(type(doc)) # >> <class 'docx.document.Document'>

# Documentオブジェクトのsaveメソッドの引数にファイル名を指定する
doc.save('OtherName.docx')

2.3 本文の段落(Paragraphオブジェクト)を追加する

Wordの本文は、改行して文章の意味を区切る“段落” Paragraphオブジェクト を追加していきながら構成していきます。

Paragraphオブジェクトを取得するには、いくつかの方法がありますが単純に追加するだけならadd_paragraph()メソッド を次の書式のように使うことになります。

Paragraphオブジェクト

Documentオブジェクト.add_paragraph(text, style)


引数1:filename:保存ファイル名を指定 (オプショナル引数)

引数2:style:段落に設定するスタイルを指定する(オプショナル引数、名前付き引数で指定)

戻り値:Paragraphオブジェクト

引数styleには、Wordで設定できる様々な文章スタイルを設定することができます。

図5は引数styleに指定可能なスタイル書式の一覧になります。

タイトル「Title」見出し「Heading *」リスト「List **」といったように文字列で指定します。

Paragraph_styles
図5  add_paragraphのstyle引数に指定可能な書式一覧

また、ファイルに含まれるすべてのParagraphオブジェクトを取得するには、

Paragraphsプロパティ を使ってコレクション(リスト形式)として取得することができます。

Paragraphオブジェクト

Documentオブジェクト.paragraphs


戻り値:Paragraphオブジェクトのコレクション

Paragraphオブジェクトに関連したプロパティは以下のようなものがあります。

Paragraphオブジェクトの主なメソッド・プロパティ

段落の文字列の取得(Textオブジェクトの取得)と設定する

 Paragraphオブジェクト.textプロパティ


〇 段落のスタイルを設定する

 Paragraphオブジェクト.styleプロパティ

 設定できるスタイルは図5を参照


〇 段落の開始位置を設定する

 Paragraphオブジェクト.paragraph_format.alignmentプロパティ

 設定できる定義は次の図6を参照

paragraph_format.alignmentプロパティに指定できる定数は次のとおりです。

WD_PARAGRAPH_ALIGNMENT
図6 WD_ALIGN_PARAGRAPHの定義一覧

Paragraphオブジェクトを使ったコード例を示します。

add_paragraph()メソッド に文字列とスタイル(Title/List Number)を指定してParagraphオブジェクトを取得しています。(A)(B)また、(C)の段落では各種プロパティで文章を設定しています。

from docx import Document                     # Documentクラスをインポート
from docx.enum.text import WD_ALIGN_PARAGRAPH # 段落位置の定義クラスをインポート

sentence = ['Python(パイソン)はインタープリタ型の高水準汎用プログラミング言語',
            'Pythonは1980年代後半にABC言語の後継としてリリースされた',
            'Pythonは動的に型付言語である',
            'Pythonはオブジェクト指向を採り入れている']

# Documentオブジェクトを取得
doc = Document()

# Paragraphオブジェクトを追加(タイトル)・・・(A)
doc.add_paragraph('python-docxでWordを操作する', style='Title')

for i in range(0, len(sentence)):

    # Paragraphオブジェクトを追加(リスト番号)・・・(B)
    doc.add_paragraph(sentence[i], style='List Number')


# Paragraphオブジェクトを追加(デフォルト)・・・(C)
paragraph_1 = doc.add_paragraph()

# textプロパティで文字を追加
paragraph_1.text = '段落の位置(中央合わせ)'

# alignmentプロパティで段落の位置を設定(中央合わせ)
paragraph_1.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER

# paragraphsプロパティでParagraphオブジェクトの個数を調べる
print(len(doc.paragraphs)) # >>6


doc.save('List2.docx')

List2の実行結果は以下のようになりました。

List2の実行結果
図7 List2の実行結果

タイトル(Title)の段落とリスト(List Number)付きの段落を設定し、Paragraphオブジェクトの各種プロパティの確認(文字・スタイル・位置合わせ)することができました。

さて、ここまでのParagraphオブジェクトをつかうことで文章の大枠のつくりを作ることができることはご理解いただけたと思います。

ですが、文字を大きくしたり、太線、斜線、色付けなど装飾されていない控えめな文章になっています。これらのことはこの後で解説する Runオブジェクト を使うことで対応することが可能となります。

2.4 ページを改めて段落を追加する

ページを追加する、途中の段落からページを改めて新しいページから文章を追加していきたい、そのような時に使うのが add_page_bread()メソッド です。

Documentオブジェクト

Documentオブジェクト.add_page_break()


戻り値:Paragraphオブジェクト

このメソッドは、先述したadd_paragraph()メソッドのように引数に文字列やスタイルを指定して直接段落をつくることはできない点は注意です。

あくまでカーソルを次ページの先頭に移動させるだけですので、新ページで段落を追加するにはadd_paragraph()メソッドを併用する必要があります。

from docx import Document 

# Documentオブジェクトを取得
doc = Document() 

# Paragraphオブジェクトを追加 [A]
doc.add_paragraph('python-docxでWordを操作する1', style='Title' )

# 改ページする
tmp=doc.add_page_break()

# Paragraphオブジェクトを追加 [B]
doc.add_paragraph('python-docxでWordを操作する2', style='Title')

doc.save('List3.docx')

List3の実行結果は以下のようになりました。

add_page_break()メソッドで1ページから2ページへカーソルが移動した後、段落が追加された。

List3の実行結果
図8 List3の実行結果

2.5 文字(Runオブジェクト)の追加/書式・装飾の設定をする

段落内の文章を単語や1文字ずつ記述したり、文字のフォントの調整や、太線、斜線、色付けなどの装飾を施すには Runオブジェクト を取得する必要があります。

Runオブジェクトを取得するには、Paragraphオブジェクトの add_run()メソッド を次の書式のようにして使います。

Runオブジェクト

Paragraphオブジェクト.add_run(text)


引数1:text:設定する文字列を指定する(オプショナル引数)

戻り値:Paragraphオブジェクト

Runオブジェクト配下には文字の装飾を行うメソッドやプロパティが用意されておりよく使う主なものとして次のようなものがあります。

メソッド・プロパティ機能その他詳細
Runオブジェクト.add_break(break_type)改行する引数:break_typeにはWD_BREAK.LINEなど6種類の改行を指定する
Runオブジェクト.add_picture(image_path, width, height)文字列中に画像を挿入する引数:image_pathに挿入する画像のファイル名
引数:width,heightに画像の幅と高さを指定する
Runオブジェクト.add_tab()タブを挿入するタブ文字(<w:tab/> 要素)を追加する
Runオブジェクト.textプロパティ文字を設定する類似の機能を持つadd_text(text)メソッドもある
Runオブジェクト.boldプロパティ文字を太文字にするTrue:太文字
Runオブジェクト.italicプロパティ文字を斜体にするTrue:斜体文字
Runオブジェクト.underlineプロパティ下線を設定するTrue:シングル下線を設定する。
その他は、WD_UNDERLINEクラスで定義
Runオブジェクト.fontプロパティFontオブジェクトを取得するFontオブジェクト.colorプロパティ:文字のフォントの色を設定する
Fontオブジェクト.sizeプロパティ:文字のフォントサイズで設定する

Runオブジェクトによる本文作成のコード例を示します。

太線( boldプロパティ )、斜線( italicプロパティ )、下線( underlineプロパティ )やFontオブジェクトによるフォントサイズ、色など細かな装飾指定を指定しています。 [A][B]また、コードの冒頭では書式指定に必要なクラスをインポートしています。

from docx import Document 
from docx.shared import Pt, RGBColor        # 単位系や色が定義されているSharedクラス
from docx.enum.dml import MSO_THEME_COLOR   # 各種プロパティの設定が定義されているEnumerationsクラス
from docx.enum.text import WD_UNDERLINE

doc1= Document() 

doc1.add_paragraph('「python-docx」でWord文書作成', style='Title')
doc1.add_paragraph('Pythonの外部ライブラリ「python-docx」を使って、\
Wordを操作することができます。Runオブジェクトを取得し各種プロパティを設定 \
することで様々な文字の装飾をすることができます。')

doc1.add_paragraph('文書作成の基本', style='Heading 1')


#---------------------------------------------------------------------------------
# Runオブジェクト関連のメソッド・プロパティ[A]
p1 = doc1.add_paragraph('文書内で')

p1.add_run('太文字').bold = True                # boldプロパティによる太文字指定
p1.add_run('や、')

p1.add_run('斜線').italic = True                # italicプロパティによる斜体指定
p1.add_run('や、')

p1.add_run('下線(DEFAULT) ').underline = True    # underlineプロパティによる下線指定
p1.add_run('や、')

p1.add_run('下線(DASH) ').underline = WD_UNDERLINE.DASH
p1.add_run('などを設定できます。')


#----------------------------------------------------------------------------------
# Fontオブジェクト関連のプロパティ[B]
p2 = doc1.add_paragraph()

# フォントサイズの指定
p2.add_run('フォントサイズ「12ポイント」').font.size = Pt(12)
p2.add_run().add_break()
p2.add_run('フォントサイズ「15ポイント」').font.size = Pt(15)
p2.add_run().add_break()

# フォントの色の指定
p2.add_run('赤色 ').font.color.rgb = RGBColor(255,0,0)
p2.add_run('青色 ').font.color.rgb = RGBColor(0,255,0)
p2.add_run('緑色 ').font.color.rgb = RGBColor(0,0,255)

p2.add_run().add_break()
p2.add_run('MSO_THEME_COLOR.ACCENT_1').font.color.theme_color = MSO_THEME_COLOR.ACCENT_2

p2.add_run().add_break()
p2.add_run('MSO_THEME_COLOR.FOLLOWED_HYPERLINK').font.color.theme_color = MSO_THEME_COLOR.FOLLOWED_HYPERLINK


doc1.save('List4.docx')

List4の実行結果は以下のようになりました。

List4の実行結果
図9 List4の実行結果

3. まとめ

いかがでしたでしょうか?

今回はMS-OfficeのWordを操作するライブラリとして「python-docx」による文章作成の基本について解説してきました。

Wordを使った文章作成をしたことがある方でしたら、オブジェクト名やメソッド・プロパティ名から直感的にコーディングすることができることを実感して頂けたのではないでしょうか。

新規コンテンツのWordドキュメントを作成するといった用途ではわざわざPythonを使う必要はありませんが、「ある程度デフォルトスタイルがある」「一度に大量のドキュメントの編集が必要」といった場合は効果的です。

今回の記事を是非、貴方の作業効率改善にお役立てください。

最後にポイントをまとめておきましょう。

➀ PythonでWordを操作操作するライブラリとしては「pywin32」「python-docx」の2つがある。それぞれに特徴や調書があるため用途に応じて使い分ける必要があるが、初心者におすすめなのは「python-docx」である。

➁ python-docxを使って文章作成するには、Paragraph/Runオブジェクトの階層構造を意識してコードを書くことが肝要となる。

➂ Paragraphオブジェクトは段落毎に、Runオブジェクトは文字毎に各種文字装飾用プロパティが充実しており本家Wordでできることの大部分は網羅される。

さて、python-docxの基本的な使い方の続編として、「画像や表(テーブル)を挿入する方法」「セクションによるページの詳細設定やヘッターやフッター設定する方法」について次の記事で解説をしています。Wordドキュメントの必須要素ですのでこちらもお読み頂ければ幸いです。

最後までお読みいただきありがとうございました。

タイトルとURLをコピーしました