まとめ
Word内の表の中の表(ネストされた表)はpython-docxで中身を取得できる
背景
以前、職場で行われた実験をデータベース化したときのことです。
いろいろ壁はあったのですが、その中で最も扱いに苦労したものに実験条件の抽出があります。
どういうことかというと、各実験での実験計画書がwordで書かれており、使用する材料は表の中の表、すなわちネストされた表として記載されてました。
↓のような感じ
Wordの表を扱うのすら面倒なのに、その中にネストされた表を抽出するのはめちゃくちゃ怠かったです。
当時はいろいろ試した記憶がありますが、この方法に落ち着きました。
方法
code1
import docx
def get_nested_table(doc):#ネストされた表を取り出すジェネレータ関数
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
yield from cell.tables
yield None
doc=docx.Document('ワードファイルのパス')
nest=next(get_nested_table(doc))
for i in range(3): #確認用
for j in range(3):
print(nest.cell(i,j).text)
親表の中の一つ一つのセルをみて、表がないかどうか確認しています。
ジェネレータ関数にすることで表が2つ以上ある場合にも対処を考えられる余地を持たせてます。
ただし、関数を呼び出すときにnext
を忘れるとジェネレータ自体を呼び出してしまいますので注意。
結果
No.
主原料
副原料
1
AA001
AD1
2
AA002
AD1
ということでネスト表の中身を抽出することができました。実際には、表が2つある場合とか、別途工夫が必要になることもあるでしょう。