このエントリーをはてなブックマークに追加 にほんブログ村 IT技術ブログへ
にほんブログ村
目次

はじめに

VisualStudioCodeを使ってソフトウェア設計書(Microsoft Word文書)を書いてみる取り組みをこれまで行ってきました。しかし、どうしてもMarkdown Proview Enhanced+PlantUML+Pandocだけだと細かい書式設定などがどうしてもうまくできないので、今度は、どこまでのことができるかやってみないとわからないのですが、ある程度のWord文書を作った後でpython-docxというPythonでWord文書を編集するソフトウェアを使用して整形してみようかと思います。

今回は、python-docxのインストールから基本的なWord文書の編集までをpython-docxのドキュメントサイトを参照して、実際にやってみたいと思います。

本記事は、関連する情報として、以下の情報を参考にしています。

python-docxのドキュメントページ
https://python-docx.readthedocs.io/en/latest/

python-docxのGitHub
https://github.com/python-openxml/python-docx

python-docxのPyPIページ
https://pypi.org/project/python-docx/

インストール

まず、python-docxをPython環境にインストールします。今回は、Anacondaの仮想環境を作り、インストールしてみました。

・Anacondaの仮想環境構築(まずはpython3.7で実施)

conda create -n python-docx-learn python=3.7 anaconda

インストール(pip)

conda installではまだpython-docxはパッケージが無いようなので、今回はpipでインストールしました。

pip install python-docx

なお、公式ドキュメントページには、python-docxのtar.gz形式でのインストール方法もありました。(下記)
インストール(tar.gzの場合)

tar xvzf python-docx-{version}.tar.gz
cd python-docx-{version}
python setup.py install

ひとまず、ここまでで、python-docxのモジュールが読み込めるか試してみます。

python
Python 3.7.4 (default, Aug  9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from docx import Document
>>> quit()

エラーが出ないのでモジュールは読み込めたようです。

この後のコードの作成はVisualStudioCodeで行います。

まずは実践してみる

次に、実際に公式ドキュメントのQuickstartにある内容と同等のことを試してみます。

Wordファイル生成/保存

from docx import Document

# ドキュメントのファイル名
docx_file = 'test.docx'

# ドキュメント生成
document = Document()


# ドキュメント保存
document.save(docx_file)

上記の記述でWordファイルが生成されます。

この操作では、Wordのオブジェクトを生成し、text.docxファイルとして保存します。
このオブジェクトは、デフォルトの「テンプレート」に基づいて空白のドキュメントが開きますWordで新しいドキュメントを開始するときに得られるものとほぼ同じです。

段落の追加

段落というか文章の追加は以下のように行います。
 

# 段落の追加
paragraph = document.add_paragraph('新しい段落')
prior_paragraph = paragraph.insert_paragraph_before('前に段落を挿入')

見出しの追加

見出しの追加は以下のように行います。

# 見出しの追加
document.add_heading('新しい見出し(デフォルトでは「見出し1」)')
document.add_heading('「見出し2」の見出し追加', level=2)

改ページの追加

改ページの追加は以下のように行います。

# 改ページの追加
document.add_page_break()

表の追加とセルの設定

表の追加やセルの設定は以下のように行います。表を追加し、行や列を取得して値を設定していくような流れになります。また、設定した値や表の行や列の数を取得することもできます。
 

# 表の追加
table1 = document.add_table(rows=2, cols=2)

# 表のセルを取得
cell = table1.cell(0, 0)

# セルのテキストを設定
cell.text = '0-0セルのテキスト'

# 2行目を取得し、テキストを挿入
row = table1.rows[1]
row.cells[0].text = '1-0セルのテキスト'
row.cells[1].text = '1-1セルのテキスト'

# ループで表の値を取得
for row in table1.rows:
    for cell in row.cells:
        print(cell.text)

# 表の行と列数を取得
row_count = len(table1.rows)
col_count = len(table1.columns)
print('{}行{}列'.format(row_count, col_count))

# 行を追加
row = table1.add_row()
row.cells[0].text = '2-0セルのテキスト'
row.cells[1].text = '2-1セルのテキスト'

# テーブルに追加する内容を定義
items = (
    (123, 'aaa', 'あああ'),
    (234, 'bbb', 'いいい'),
    (345, 'ccc', 'ううう'),
)

#
paragraph2 = document.add_paragraph('新しい段落2')

# 次のテーブルを追加
table2 = document.add_table(1, 3)

# 表のヘッダを定義
heading_cells = table2.rows[0].cells
heading_cells[0].text = '列ラベル0'
heading_cells[1].text = '列ラベル1'
heading_cells[2].text = '列ラベル2'

# 表に内容を設定
for item in items:
    cells = table2.add_row().cells
    cells[0].text = str(item[0])
    cells[1].text = item[1]
    cells[2].text = item[2]

# 表のスタイルを設定
table2.style = 'LightShading-Accent1'

イメージの貼り付け

画像などのイメージの作成は以下のように行います。サイズを指定することもできるようです。

# イメージの貼り付け
document.add_picture(
    'D:\\docker_workspace\\doc\\python-logo-master-v3-TM.png',
    width=Inches(3.6))

 

ここまでを実行してみる

ここまででやってきた処理をすべて実行してみます。最後にtext.docxの内容を確認してできたことを確認してみます。

以下がここまでの処理をすべて行ったコードです。(pydocx_text.py)

from docx.shared import Inches
from docx import Document

# ドキュメントのファイル名
docx_file = 'test.docx'

# ドキュメント生成
document = Document()

# 段落の追加
paragraph = document.add_paragraph('新しい段落')
prior_paragraph = paragraph.insert_paragraph_before('前に段落を挿入')

# 見出しの追加
document.add_heading('新しい見出し(デフォルトでは「見出し1」)')
document.add_heading('「見出し2」の見出し追加', level=2)

# 改ページの追加
document.add_page_break()

# 表の追加
table1 = document.add_table(rows=2, cols=2)

# 表のセルを取得
cell = table1.cell(0, 0)

# セルのテキストを設定
cell.text = '0-0セルのテキスト'

# 2行目を取得し、テキストを挿入
row = table1.rows[1]
row.cells[0].text = '1-0セルのテキスト'
row.cells[1].text = '1-1セルのテキスト'

# ループで表の値を取得
for row in table1.rows:
    for cell in row.cells:
        print(cell.text)

# 表の行と列数を取得
row_count = len(table1.rows)
col_count = len(table1.columns)
print('{}行{}列'.format(row_count, col_count))

# 行を追加
row = table1.add_row()
row.cells[0].text = '2-0セルのテキスト'
row.cells[1].text = '2-1セルのテキスト'

# テーブルに追加する内容を定義
items = (
    (123, 'aaa', 'あああ'),
    (234, 'bbb', 'いいい'),
    (345, 'ccc', 'ううう'),
)

# 区切り用に新しい段落を追加
paragraph2 = document.add_paragraph('新しい段落2')

# 次のテーブルを追加
table2 = document.add_table(1, 3)

# 表のヘッダを定義
heading_cells = table2.rows[0].cells
heading_cells[0].text = '列ラベル0'
heading_cells[1].text = '列ラベル1'
heading_cells[2].text = '列ラベル2'

# 表に内容を設定
for item in items:
    cells = table2.add_row().cells
    cells[0].text = str(item[0])
    cells[1].text = item[1]
    cells[2].text = item[2]

# 表のスタイルを設定
table2.style = 'LightShading-Accent1'

# イメージの貼り付け
document.add_picture(
    'D:\\docker_workspace\\doc\\python-logo-master-v3-TM.png',
    width=Inches(3.6))

# ドキュメント保存
document.save(docx_file)

出力したWordファイルは以下のようなイメージでした。
test_docx.png
記述した処理はすべてその通りにできているようですので、この先はAPIの詳細を見ながら実際にやって確認していきたいと思います。

まとめ

今回は、python-docxを使ってWord文書をPythonで編集してみました。今後は、どんなことかpython-docxでできるのかを実際にAPIを試しながら実験してみたいと思います。