今回もワードファイルの処理です。前回と同じライブラリ(python-docx)を使用します。最初に前回に続きワードファイルの読み込みの表の処理、次に1からワードファイルを生成することにします。サンプルで使用するワードのサンプルファイルは前回と同じです。

 なお、以後に説明するプログラムは上記のワードのドキュメントと同じ階層のディレクトリ(フォルダ)にあるものとします。もちろんプログラム内でワードファイルがあるファイルパスを指定すれば異なる場所にあっても問題ありません。

表の読み出し

 前回は段落処理では表の情報は読み出せないと説明しました。段落はparagraphオブジェクトを使いましたが、表はtableオブジェクトを使います。
 表には列と行があります。tableオブジェクトの中にcolumnsとrowsオブジェクトがあり、それぞれ列と行にアクセスできます。
 以下のプログラムはコマンドラインで指定したワードファイルの表の総数と、最初と2番目の表の行列の総数を表示します。

import sys
import docx
doc = docx.Document(sys.argv[1])
print('表の総数:',len(doc.tables))
print('表1行数:',len(doc.tables[0].rows))
print('表1列数:',len(doc.tables[0].columns))
print('表2行数:',len(doc.tables[1].rows))
print('表2列数:',len(doc.tables[1].columns))

 表の各セルにアクセスするにはさらにcellオブジェクトを経由します。セル内のテキスト(文字)にアクセスするにはtextを使います。cells[0]で最初のセルに、cells[1]で2番目のセルにアクセスできます。その際、列にアクセスしているか行にアクセスしているかでアクセスするセルが異なります。また、複数のセルを連結している場合も注意が必要です。
 以下のプログラムはコマンドラインで指定したワードファイルの最初の表の各セルの内容を表示します。

import sys
import docx
doc = docx.Document(sys.argv[1])
print(doc.tables[0].rows[0].cells[0].text)
print(doc.tables[0].columns[1].cells[0].text)
print(doc.tables[0].rows[1].cells[0].text)
print(doc.tables[0].rows[1].cells[1].text)

表の内容を読み出して,区切りにすることもできます。本当は引用符等で囲んだ方が無難ですが、一応CSV形式っぽく表示されます。
 以下のプログラムはコマンドラインで指定したワードファイルからコマンドラインで指定した表の各セルの内容を,区切りで表示します。

import sys
import docx
doc = docx.Document(sys.argv[1])
tbl = doc.tables[int(sys.argv[2])]
for tblRow in tbl.rows:
  for cell in tblRow.cells:
    print(cell.text,end=',')
  print()

リダイレクトでテキストファイルに保存することもできます。

新規にワードファイルを作成

 今度は1からワードファイルを作成してみます。新規に作成する場合はdocx.Document()とだけ指定します。これまでは()の中に開きたいワードファイル名(ファイルパス)を指定していました。新規に作成する場合は何も指定しません。
 新規に作成したら最後に保存します。保存するにはsave()の()の中に保存するワードファイル名(ファイルパス)を指定します。
 以下のプログラムを実行すると真っ白な何も内容のないワードファイルが作成されます。

import docx
doc = docx.Document()
doc.save("sampleX1.docx")

文字(テキスト)を追加

 真っ白な内容のないワードファイルでは役に立ちませんので、今度は文字を追加してみます。文字を追加するといっても実際には最初に段落を追加することになります。段落の追加はadd_paragraph()を使います。()内に段落に表示する文字を指定します。
 以下のようにすると1つだけ段落が追加されたワードファイルが作成されます。

import docx
doc = docx.Document()
doc.add_paragraph("商品価格改訂についてのお知らせ")
doc.save("sampleX2.docx")

以下のプログラムのようにadd_paragraph()に何も指定しないか、空文字を指定すると空の段落が作成されます。add_paragraph()を使えば順番に段落を追加していくことができます。

import docx
doc = docx.Document()
doc.add_paragraph("商品価格改訂についてのお知らせ")
doc.add_paragraph("")
doc.add_paragraph("平素は格別のご高配を賜り厚く御礼申し上げます。")
doc.save("sampleX3.docx")

段落の行揃え

 段落を追加したら行揃えを行ってみます。行揃えを指定する場合は最初に以下の一行を追加します。これで行揃えを指定する定数が読み込まれます。

from docx.enum.text import *

 行揃えは段落を扱うparagraphオブジェクトalignmentに以下の値を指定します。他にも指定できる値がありますが、期待通りに反映されない値もあるようです。詳細はpython-docxのページを参照して下さい。

WD_ALIGN_PARAGRAPH.LEFT 左揃え
WD_ALIGN_PARAGRAPH.CENTER 中揃え(センタリング)
WD_ALIGN_PARAGRAPH.RIGHT 右揃え
WD_ALIGN_PARAGRAPH.DISTRIBUTE 両端揃え
WD_PARAGRAPH_ALIGNMENT【公式ページ】
https://python-docx.readthedocs.io/en/latest/api/enum/WdAlignParagraph.html

 段落を追加して最初の段落を中央揃え(センタリング)するプログラムは以下のようになります。

import docx
from docx.enum.text import *
doc = docx.Document()
p1 = doc.add_paragraph("商品価格改訂についてのお知らせ")
doc.add_paragraph("")
doc.add_paragraph("平素は格別のご高配を賜り厚く御礼申し上げます。")
p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.save("sampleX4.docx")

文字サイズの設定

 次に文字サイズを変更してみます。文字のサイズや装飾などは段落のrunオブジェクトを経由します。文字サイズの場合は前回と同様にfont.sizeにアクセスします。ここに指定したポイントの文字にするにはdocx.shared.Pt()を使います。()内に設定するポイント値を指定します。
 以下のプログラムは最初の段落の文字サイズを24ptにします。

import docx
from docx.enum.text import *
doc = docx.Document()
p1 = doc.add_paragraph("商品価格改訂についてのお知らせ")
doc.add_paragraph("")
doc.add_paragraph("平素は格別のご高配を賜り厚く御礼申し上げます。")
p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
p1.runs[0].font.size = docx.shared.Pt(24)
doc.save("sampleX5.docx")

文字色の設定

 最後に文字の色を設定してみます。任意の色を指定する場合はrunオブジェクトのfont.color.rgbに値を設定します。このfont.color.rgbにdocx.shared.RGBColor(赤の輝度,緑の輝度,青の輝度)で指定した色を入れます。輝度は0〜255です。数値が小さいほど暗くなり、大きくなるほど明るくなります。例えば主な色は以下のようになります。

docx.shared.RGBColor(0,0,0) 黒色
docx.shared.RGBColor(0,0,255) 青色
docx.shared.RGBColor(255,0,0) 赤色
docx.shared.RGBColor(255,0,255) 紫色
docx.shared.RGBColor(0,255,0) 緑色
docx.shared.RGBColor(0,255,255) 水色
docx.shared.RGBColor(255,255,0) 黄色
docx.shared.RGBColor(255,255,255) 白色
docx.shared.RGBColor(128,128,128) 灰色

 以下のプログラムは最初の段落全体の文字を赤色にします。

import docx
from docx.enum.text import *
doc = docx.Document()
p1 = doc.add_paragraph("商品価格改訂についてのお知らせ")
doc.add_paragraph("")
doc.add_paragraph("平素は格別のご高配を賜り厚く御礼申し上げます。")
p1.alignment = WD_ALIGN_PARAGRAPH.CENTER
p1.runs[0].font.size = docx.shared.Pt(24)
p1.runs[0].font.color.rgb = docx.shared.RGBColor(255,0,0)
doc.save("sampleX6.docx")

 色指定でなく文字をハイライトする場合はfont.highlight_colorにハイライトカラーを指定します。どのようなハイライトカラーを指定できるかは以下の公式ページで確認できます。

この記事は
Members+会員の方のみ御覧いただけます

ログイン/無料会員登録

会員サービスの詳細はこちら