みーのぺーじ

みーが趣味でやっているPCやソフトウェアについて.Python, Javascript, Processing, Unityなど.

Python-docxで1行に左揃えと右揃えを混在させる

Python-docx はPythonでワード文書を出力できるライブラリです.ワードのみ許可される事務所類を自動生成するのに便利です.

1行に左揃えと右揃えを混在させる方法が分かったのでメモします.

TabStopという便利な機能がワードにあります*1.TabStopはタブの開始位置を指定するためのもので,alignment, leader, positionの属性があります*2

1つのParagraphにTabStopを2つ用意して,1つ目を左揃え,2つ目を右揃えにすることで,上記を実現できます.

サンプルとして,左,中央,右の3つを混在させたワード文書を作成してみます.

from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_TAB_ALIGNMENT

document = Document()

page = document.sections[0]
width = page.page_width - page.left_margin - page.right_margin # 文書の幅を計算

document.add_paragraph('Left message. \t Center message.\t Rignt message.') # \tはタブ文字として変換される

r = document.add_paragraph('Left message. \t Center message.\t Rignt message.')

tabstops = r.paragraph_format.tab_stops
tabstops.add_tab_stop(0, WD_TAB_ALIGNMENT.LEFT)
tabstops.add_tab_stop(int(width/2), WD_TAB_ALIGNMENT.CENTER) # 文書の幅を半分にして中央を取得
tabstops.add_tab_stop(width, WD_TAB_ALIGNMENT.RIGHT)

print([(t.position, t.alignment) for t in tabstops])

document.add_paragraph('Left message. \t Center message.\t Rignt message.')

document.save('demo.docx')
[(0, 0), (2743200, 1), (5486400, 2)]

f:id:atsuhiro-me:20171118150749p:plain:w300

2行目でCenter message. Right message.がそれぞれ中央,右に配置されているのが分かります.

段落に対してtabstopsは指定するので,前後の段落では影響を受けません.