python-docxのtable内にtableを配置する

Microsoft Wordの文章で、表に中のセルに更に表を埋め込む場合があると思います。

from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT

doc = Document()
section = doc.sections[-1]
new_width, new_height = section.page_height, section.page_width
section.orientation = WD_ORIENT.LANDSCAPE
section.page_width = new_width
section.page_height = new_height

table = doc.add_table(3, 3, style='Table Grid')
j = 0
for row in table.rows:
    for cell in row.cells:
        if j == 4:
            tbl_in_tbl = cell.add_table(3, 3)
            k = 0
            for mini_row in tbl_in_tbl.rows:
                for mini_cell in mini_row.cells:
                    p = mini_cell.add_paragraph()
                    p.alignment=WD_ALIGN_PARAGRAPH.CENTER
                    r = p.add_run()
                    s = str(k+11) + ".jpg"
                    r.add_picture(s, width=Cm(1.5), height=Cm(1))
                    k += 1
        else:
            p = cell.add_paragraph()
            p.alignment=WD_ALIGN_PARAGRAPH.CENTER
            r = p.add_run()
            s = str(j+1) + ".jpg"
            r.add_picture(s, width=Cm(5), height=Cm(4))
        j += 1

doc.save("test.docx")

手元の環境では、セル内に表示したtableに対するstyleは設定できませんでした。

python-docxでtableを結合する

以下では書類の向きを横向きにして2行2列の表を作成し、2行目を結合してそれぞれに画像を貼り付けています。

from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.section import WD_ORIENT

doc = Document()

section = doc.sections[-1]
new_width, new_height = section.page_height, section.page_width
section.orientation = WD_ORIENT.LANDSCAPE
section.page_width = new_width
section.page_height = new_height

tables = doc.add_table(2, 2)
tables.alignment = WD_TABLE_ALIGNMENT.CENTER

a = tables.cell(1, 0)
b = tables.cell(1, 1)
A = a.merge(b)

p = doc.tables[0].rows[0].cells[0].paragraphs[0]
p.alignment=WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
r.add_picture('1.jpg',width=Cm(8.0), height=Cm(6.0))
r.add_break()
r.add_text('風景1')

p = doc.tables[0].rows[0].cells[1].paragraphs[0]
p.alignment=WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
r.add_picture('2.jpg',width=Cm(8.0), height=Cm(6.0))
r.add_break()
r.add_text('風景2')

p = doc.tables[0].rows[1].cells[1].paragraphs[0]
p.alignment=WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
r.add_picture('3.jpg',width=Cm(8.0), height=Cm(6.0))
r.add_break()
r.add_text('風景3')

doc.add_page_break()

doc.save('test.docx')
結合された表を含むWord文章
結合された表を含むWord文章

結合したセルにアクセスするには、

p = doc.tables[0].rows[1].cells[0].paragraphs[0]

としても良いし、

p = doc.tables[0].rows[1].cells[1].paragraphs[0]

としても良いようです。

また、書類を横向きにするためには

section.orientation = WD_ORIENT.LANDSCAPE

とするだけではダメで、

section.page_width
section.page_height

を書き換えてサイズを変更する必要があります。

python-docxでWORD文章に表を作成して画像とテキストを貼り付ける

以下、サンプルです。

from docx import Document
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT

doc = Document()

tables = doc.add_table(rows=3, cols=2)
tables.alignment = WD_TABLE_ALIGNMENT.CENTER

count = 0
for i in range(3):
	for j in range(2):
		count += 1
		fname = str(count) + '.jpg'
		s = '風景' + str(count)
		p = doc.tables[0].rows[i].cells[j].paragraphs[0]
		p.alignment=WD_ALIGN_PARAGRAPH.CENTER
		r = p.add_run()
		r.add_picture(fname,width=Cm(8.0), height=Cm(6.0))
		r.add_break()
		r.add_text(s)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run()
r.add_text('6つの風景')

doc.save('test.docx')
test.docx

python-docx で Microsoft Word を操作する

ワードファイルに余計なマクロを設定することなく大量に画像を貼り付けることができます。

import docx
from docx.shared import Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = docx.Document()

doc.add_picture('1.jpg', width=Cm(12.00))
p = doc.paragraphs[-1]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph('駿河湾と夏の富士山')
p = doc.paragraphs[-1]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_picture('2.jpg', width=Cm(12.00))
p = doc.paragraphs[-1]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
doc.add_paragraph('駿河湾に沈む夕陽')
p = doc.paragraphs[-1]
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
p = doc.add_page_break()

doc.save('test.docx')

test.docx は以下のようになります。

wordドキュメント