
【悩み】
・PythonでWord文書を新規作成したい。
・Word文書を操作できるPythonライブラリは存在する?
・Pythonで集計したデータなどをWord文書に自動転記したい。
こういった「悩み」に答えます。
【本記事の内容】
① Word文書向けのPythonライブラリとは?
➁ 事前準備:各種インストールとWordの構造理解
➂ PythonでWord文書を新規作成:10の事例
本記事に掲載した方法を実践したことで、PythonからWord文書(docxやdocファイル)を新規作成できました(下の動画参照)。
記事の前半では「Word文書に関連するPythonライブラリの一覧」と「よく使われるライブラリ」について解説します。
記事の後半では「ライブラリのインストール方法などの環境準備」と「Word文書を新規作成するPythonプログラム」を説明します。
この記事を読み終えることで、「Pythonでデータ集計した結果などをWord文書に転記できる」状態になります。
ちなみに、「編集」「変換」「抽出」といった操作もPythonで実施できます。以下の記事にまとめているので興味がある方は是非ご覧ください。
Word文書向けのPythonライブラリとは?

Pythonで使えるWord関連のライブラリに関してご紹介します。
【ご紹介事項】
・Word関連のPythonライブラリ3選
・python-docxとは?:一通りの操作が可能
・bayoo-docxとは?:コメント挿入が可能
以降で、上記の各項目に関して説明します。
Word関連のPythonライブラリ3選
PythonでWordを操作できるライブラリとして、以下があります。
【ライブラリ一覧】
・python-docx(OSS)
・Bayoo-docx(OSS)
・Aspose.Words(商用)
以降で各ライブラリの「できること」「ライセンス」「開発頻度」「開発言語」に関して説明します。
python-docxとは?:一通りの操作が可能
python-docxライブラリの概要を以下に記載します。
【python-docxとは】
本ライブラリを使うことで「無料でWordの作成や編集」ができます。そのため、新規作成などの基本的な操作を無料で実現できます。
ただし、コメント挿入は現時点(2023年2月28日時点)でできません。
ライセンスに関して以下に記載します。
【ライセンスについて】
python-docxのライセンスは、MIT(2023年2月28日時点)です。
特に制限なく、無料で使えます。
参照:
・python-docxのライセンスページ(GitHub)
・MITとは(Wikipedia)
また、「直近でどのぐらい活発に開発されているか?」に関する情報は、以下のサイトから確認できます。
参照:python-docxの開発頻度(GitHub)

上図より、python-docxは活発に開発されているライブラリではないです。
そのため、脆弱性やバグがあった場合、即座に修正されず、利用者自身でライブラリの修正が必要になると考えられます。
商用で本ライブラリを使う際は、注意してください。
ちなみに、python-docxは、以下の言語で開発されています。
参照:python-docxの開発言語(GitHub)

bayoo-docxとは?:コメント挿入が可能
bayoo-docxライブラリの概要を以下に記載します。
【bayoo-docxとは】
bayoo-docxを使うことで「Wordにコメント挿入」ができます。
bayoo-docxは、python-docxをfork(派生)して作成されたライブラリです。
そのため、python-docxの機能も使えます。
本ライブラリのライセンスに関して以下に記載します。
【ライセンスについて】
bayoo-docxのライセンスは、MIT(2023年2月28日時点)です。
特に制限なく、無料で使えます。
参照:bayoo-docxのライセンスページ(GitHub)
また、「直近でどのぐらい活発に開発されているか?」に関する情報は、以下のサイトから確認できます。
参照:bayoo-docxの開発頻度(GitHub)

上図より、python-docxと比べるとbayoo-docxの方が活発に開発されているように見えます。ただし、上図より、2021年以降からは定期的な開発がされていないです。
そのため、脆弱性やバグがあった場合、即座に修正されず、利用者自身でライブラリの修正が必要になると考えられます。
商用で本ライブラリを使う際は、注意してください。
ちなみに、bayoo-docxは、以下の言語で開発されています。
参照:bayoo-docxの開発言語(GitHub)

Aspose.Wordsとは?:商用ライブラリ
Aspose.Wordsライブラリの概要を以下に記載します。
【Aspose.Wordsとは】
Aspose.Wordsを使うことで「Wordの作成や編集」だけでなく「PDFをWordに変換」などの応用的な操作もできます。
Aspose.Wordsのライセンスに関して以下に記載します。
【ライセンスについて】
Aspose.WordsはOSSではなく、Aspose社が開発した商用ライブラリです。
評価用に無料で使える機能はありますが、全機能を使いたい場合、お金がかかります。
参照:Aspose.Wordsの料金プラン
また、Aspose.Wordsの「直近でどのぐらい活発に開発されているか?」に関する情報は、以下のサイトから確認できます。
参照:Aspose.Wordsのリリース頻度(pypi)

上図より、Aspose.Wordsは活発に開発されているライブラリに見えます。
そのため、脆弱性やバグがあった場合、即座に修正されると考えられます。
PythonでWordの操作をしたい場合、3つのライブラリから選択しましょう。基本的な操作であれば、OSSであるbayoo-docxまたはpython-docxを選択すれば問題ないです。
事前準備:各種インストールとWordの構造理解

「PythonでWord文書の新規作成するための準備」に関してご紹介します。
【流れ】
手順1:Pythonのインストール
手順2:python-docxとbayoo-docxのインストール
手順3:Word文書のオブジェクト構造
上記の流れで説明します。
Pythonのインストール
以下の記事を参考にし、お使いのパソコンやサーバーにPythonをインストールしましょう。
>> 【ubuntu向け】pyenvでPythonをインストールする手順【簡単】
>> 【コピペOK】pyenvでPythonをインストールする手順【Linux用】
>> 【最短5分】PyAutoGUIをWindowsにインストールする手順の「手順1:Pythonのインストール」を参照
>> 【環境構築】インストーラーでMacOSにPythonをインストール
python-docxとbayoo-docxのインストール
python-docxとbayoo-docxライブラリをインストールするために、以下のコマンドを順番に実行してください。
pip install python-docx
pip install bayoo-docx
pip list
コマンド実行後、「python-docx(バージョン)」と「bayoo-docx(バージョン)」が表示された場合、「正常にライブラリをインストールできた」と判断できます。
Word文書のオブジェクト構造
Word文書は、以下のWordprocessingML(略称:WML)という言語で作成されます。
【WordprocessingMLとは】
Microsoftによって、Office Open XMLというファイルフォーマットが公開され、2006年と2008年に標準規格になりました。WordprocessingMLとは、Office Open XMLを簡単に記述できる言語のことを指します。
参照:Office Open XML ファイルフォーマットとは(Wikipedia)
先ほど紹介したWord関連のPythonライブラリでは、上記のWordprocessingMLに基づいてWord文書をPythonから操作します。そのため、WordprocessingMLでのオブジェクト構造を理解しておくことで、Pythonで細かいWord操作を簡単に実現できます。
以下の図に、WordprocessingMLのオブジェクト構造をまとめました。python-docxの公式サイトを確認することで、WordprocessingMLのオブジェクト構造を理解できます。
>> WordprocessingMLのオブジェクトについて(公式サイト)

以降で、python-docxとbayoo-docxを使いWord文書の新規作成を実践してみましょう。
PythonでWord文書を新規作成:10の事例

「PythonでWord文書を新規作成」に関してご紹介します。
【ご紹介事項】
・新規作成し保存:save関数
・見出しの作成:add_heading関数
・ヘッダーとフッターの作成
・段落を作成し文字の書き込み:add_paragraph関数
・改ページの実施:add_page_break関数
・フォントの指定
・リスト(箇条書き)の挿入
・画像の貼り付け:add_picture関数
・テーブル(表)の挿入:add_table関数
・コメント挿入:add_comment関数
以降で、上記の各項目に関して説明します。
新規作成し保存:save関数
「Wordを新規作成し保存する」プログラムは、以下となります。
import docx
# 新規作成
document = docx.Document()
# 保存
document.save('sample.docx')
上記のプログラムを「create-new-word.py」というファイル名で保存しましょう。
【saveの構文】
・機能
指定したファイル名でWord文書を新規作成する
・使い方
Document型の変数.save(ファイル名)
・補足
doc拡張子なWord文書も新規作成できる
・参照
save関数のリファレンス(公式サイト)
以下のコマンドで、上記プログラムを実行できます。
python create-new-word.py
コマンド実行後、以下のような何も書かれていないWord文書が新規作成されます。

見出しの作成:add_heading関数
「見出しの作成」プログラムは、以下となります。
import docx
# 新規作成
document = docx.Document()
# 見出しの作成
document.add_heading('大見出し', 0)
document.add_heading('中見出し', 1)
# 保存
document.save('sample.docx')
上記のプログラムを「insert-head.py」というファイル名で保存しましょう。
【構文】
・機能
指定した種類の見出しを追加する
・使い方
Document型の変数.add_heading(“テキスト”, 見出しのレベル)
・補足
見出しのレベルは0~9で指定、0にすると一番大きな見出しになる
・参照
add_heading関数のリファレンス(公式サイト)
以下のコマンドで、上記プログラムを実行できます。
python insert-head.py
コマンド実行後、以下のような見出しが追加されたWord文書が新規作成されます。

ヘッダーとフッターの作成
「ヘッダーとフッターの作成」プログラムは、以下となります。
import docx
# 新規作成
document = docx.Document()
# ヘッダーとフッター
section = document.sections[0]
header = section.header
paragraph = header.paragraphs[0]
paragraph.text = "ヘッダーです"
footer = section.footer
paragraph = footer.paragraphs[0]
paragraph.text = "フッターです"
# 保存
document.save('sample.docx')
上記のプログラムを「insert-footer-header.py」というファイル名で保存しましょう。

以下のコマンドで、上記プログラムを実行できます。
python insert-footer-header.py
コマンド実行後、以下のようなフッターとヘッダーが追加されたWord文書が新規作成されます。

段落を作成し文字の書き込み:add_paragraph関数
「段落を作成し文字の書き込み」プログラムは、以下となります。
import docx
# 新規作成
document = docx.Document()
# 段落
p_first = document.add_paragraph('段落①\n')
p_first.add_run('段落①の文章です。')
# 保存
document.save('sample.docx')
上記のプログラムを「insert-paragraph.py」というファイル名で保存しましょう。
【構文】
・機能
段落を新規追加し、段落内に指定したテキストを書き込む
・使い方
Document型の変数.add_paragraph(“テキスト”)
・参照
add_paragraph関数のリファレンス(公式サイト)
【構文】
・機能
段落内に指定したテキストを追加する
・使い方
Paragraph型の変数.add_run(“テキスト”)
・参照
add_run関数のリファレンス(公式サイト)
以下のコマンドで、上記プログラムを実行できます。
python insert-paragraph.py
コマンド実行後、以下の段落が追加されたWord文書が新規作成されます。

改ページの実施:add_page_break関数
「改ページの実施」プログラムは、以下となります。
import docx
# 新規作成
document = docx.Document()
# 改ページ
document.add_page_break()
# 保存
document.save('sample.docx')
上記のプログラムを「insert-pagebreak.py」というファイル名で保存しましょう。
【構文】
・機能
新しいページを追加する
・使い方
Document型の変数.add_page_break()
・参照
add_page_break関数のリファレンス(公式サイト)
以下のコマンドで、上記プログラムを実行できます。
python insert-pagebreak.py
コマンド実行後、以下のようにページが追加されたWord文書が新規作成されます。

フォントの指定
「フォントの指定」プログラムは、以下となります。
import docx
from docx.shared import Cm
from docx.oxml.ns import qn
from docx.shared import RGBColor
# 新規作成
document = docx.Document()
# 段落追加
paragraph = document.add_paragraph()
run = paragraph.add_run('フォント指定')
# フォントの指定
run.font.name = 'Meiryo UI'
run._element.rPr.rFonts.set(qn('w:eastAsia'), run.font.name)
# 色の設定
run.font.color.rgb = RGBColor(204, 0, 0)
# 下線の設定
run.underline = True
# サイズの設定
run.font.size = docx.shared.Pt(24)
# 保存
document.save('sample.docx')
上記のプログラムを「setting-font.py」というファイル名で保存しましょう。
Runオブジェクト内の変数やfontオブジェクトを設定することで、色や下線などのフォントに関係する設定ができます(下図参照)。

以下のコマンドで、上記プログラムを実行できます。
python setting-font.py
コマンド実行後、以下のように装飾された文字が書き込まれたWord文書が新規作成されます。

リスト(箇条書き)の挿入
「リスト(箇条書き)の挿入」プログラムは、以下となります。
import docx
from docx.shared import Cm
from docx.oxml.ns import qn
from docx.shared import RGBColor
# 新規作成
document = docx.Document()
# リスト
document.add_paragraph("果物", style="List Bullet")
for item in ["りんご", "ミカン", "いちご"]:
document.add_paragraph(item, style='List Bullet 2')
document.add_paragraph("ラーメン", style="List Number")
for item in ["豚骨", "しょうゆ", "味噌"]:
document.add_paragraph(item, style='List Number 2')
# 保存
document.save('sample.docx')
上記のプログラムを「insert-list.py」というファイル名で保存しましょう。
【箇条書き】
add_paragraphの任意引数styleに「List Bullet」を指定することで実現できます。番号付き箇条書きを設定したい場合は「List Number」を指定します。
参照:styleに指定できるリスト関連の値(公式サイト)
以下のコマンドで、上記プログラムを実行できます。
python insert-list.py
コマンド実行後、以下のような箇条書きが記載されたWord文書が新規作成されます。

画像の貼り付け:add_picture関数
「画像の貼り付け」プログラムは、以下となります。
import docx
from docx.shared import Cm
# 新規作成
document = docx.Document()
# 画像
document.add_picture('image-sample.png', width=Cm(10))
# 保存
document.save('sample.docx')
上記のプログラムを「insert-image.py」というファイル名で保存しましょう。
【構文】
・機能
指定した画像を挿入する
・使い方
Document型の変数.add_picture(“画像ファイルのPATH”)
・補足
任意引数としてwidthやheightがあり、画像の縦横を指定できる
・参照
add_picture関数のリファレンス(公式サイト)
以下のコマンドで、上記プログラムを実行できます。
python insert-image.py
コマンド実行後、以下のように画像が挿入されたWord文書が新規作成されます。

テーブル(表)の挿入:add_table関数
「テーブル(表)の挿入」プログラムは、以下となります。
import docx
from docx.shared import Cm
# 新規作成
document = docx.Document()
# テーブル設定
table = document.add_table(rows=2, cols=2, style="Table Grid")
# 表の1行目にデータを設定
head_row = table.rows[0].cells
head_row[0].text = "項番"
head_row[1].text = "名称"
# 表の2行目にデータを設定
data_row = table.rows[1].cells
data_row[0].text = "1"
data_row[1].text = "りんご"
# 保存
document.save('sample.docx')
上記のプログラムを「insert-table.py」というファイル名で保存しましょう。
【構文】
・機能
指定したテーブルを挿入する
・使い方
Document型の変数.add_table(rows=行数, cols=列数,
style=”テーブルのスタイル”)
・補足
指定できるテーブルのスタイルの一覧(公式サイト)
・参照
add_table関数のリファレンス(公式サイト)
Tableオブジェクトの中にあるcellsオブジェクトのtext変数に値を設定することで、表のカラムにデータを挿入できます(下図参照)。

以下のコマンドで、上記プログラムを実行できます。
python insert-table.py
コマンド実行後、以下のような表が挿入されたWord文書が新規作成されます。

コメント挿入:add_comment関数
「コメント挿入」プログラムは、以下となります。
import docx
# 新規作成
document = docx.Document()
# コメント
p_second = document.add_paragraph('段落➁')
p_second.add_run('段落➁の文章です。')
run = p_second.add_run('コメント入り文です。')
run.add_comment('コメントです。', author='hero')
# 保存
document.save('sample.docx')
上記のプログラムを「insert-comment.py」というファイル名で保存しましょう。
【構文】
・機能
コメントを挿入する
・使い方
Run型の変数.add_comment(“テキスト”, author=’コメント記入者名’)
Paragraph型の変数.add_comment(“テキスト”, author=’コメント記入者名’)
・補足
python-docxではコメント機能はないため、bayoo-docxを使う
・参照
add_comment関数のリファレンス(公式サイト)
以下のコマンドで、上記プログラムを実行できます。
python insert-comment.py
コマンド実行後、以下のようなコメントが挿入されたWord文書が新規作成されます。

上記のようにpython-docxとbayoo-docxを使うことで、様々なパターンのWord文書をPythonで新規作成できます。
Pythonを使うことで、Word文書の新規作成操作を自動化できることを説明しました。このPythonを使うことで、あらゆる業務や作業を自動化できます。
その事例やヒントを知りたい方には、以下の本がオススメです。
ちなみに、上記教材の詳細なレビューに関しては、以下のサイトにまとめています。
>> 退屈なことはPythonにやらせように関するレビューの一覧
【まとめ】2つのライブラリで簡単にWordの新規作成が可能

いかがでしたでしょうか?
上記で紹介したpython-docxとbayoo-docxライブラリを使うことで、PythonからWord文書の新規作成ができます。
最後にもう一度内容を確認しましょう。
【おさらい】
・PythonのWord向けのライブラリとして3つのライブラリがある
・python-docxでWordの新規作成の操作をPythonで実現できる
・コメント挿入をしたい場合はbayoo-docxを使うことで実現できる
ちなみに、「編集」「変換」「抽出」といった操作もPythonで実施できます。以下の記事にまとめているので興味がある方は是非ご覧ください。
本ブログでは、「業務の時短化に繋がるIT技術」や「クラウドやOSSの学び方」などを発信しています。定期的に更新していますので、ぜひブックマークをよろしくお願いいたします。
コメント