python-docxを使って表のデータを1行ずつリストにする、Pythonのコードをご紹介しています。
pywin32のwin32com.clientモジュールを使っても、もちろん同様の処理は可能です。
Wordの表データを1行ずつリストにするサンプルスクリプト
Cドライブtempフォルダーに、表の存在するWordファイルsample.docxを用意して、以下のスクリプトを実行してみてください。
wd_app = win32com.client.Dispatch('Word.Application')
wd_app.Visible = True
doc = wd_app.Documents.Open(r'C:\temp\sample.docx')
tbl = doc.Tables(1)for row in tbl.Rows:
values = []
for cell in row.Cells:
values.append(cell.Range.Text[:-2])
print(values)
Wordが起動し、C:\temp\sample.docxが開かれ、1つ目の表のデータが、
['a1', 'b1', 'c1']
['a2', 'b2', 'c2']
のように、Pythonのリストとして取得できる様子を確認できます。
サンプルスクリプトで行っている処理
Wordの起動
最初の2行は、pywin32を使ってWordを利用する際の、お決まりのコードです。
import win32com.client
wd_app = win32com.client.Dispatch('Word.Application')
ここまでの実行で、Wordが非表示状態で起動し、変数wd_appにWordのApplicationオブジェクトへの参照が、
格納されます。
この後は、Word VBAによく似たコードと、Pythonのコードが混在していきます。
Wordの表示と文書のOpen
ApplicationオブジェクトのVisibleプロパティに、
論理値Trueを設定することで、Wordを表示し、
wd_app.Visible = True
DocumentsコレクションのOpenメソッドで開いた、
C:\temp\sample.docxを、変数docに代入します。
doc = wd_app.Documents.Open(r'C:\temp\sample.docx')
表の取得
Document.Tablesプロパティで取得した、
Tablesコレクションの、既定メンバーであるItemメソッドで取得した1つ目の表を、
変数tblに代入します。
tbl = doc.Tables(1)
行に対するループ処理
Table.Rowsプロパティで取得した
Rowsコレクションに含まれるRowオブジェクトを、
for文で1行ずつ処理します。
for row in tbl.Rows:
セルに対するループ処理
Row.Cellsプロパティで取得した、
Cellsコレクションから個々のセルを表すCellオブジェクトを取得して、
for cell in row.Cells:
各セル内の文字列を、リストの要素としてappendメソッドで追加しています。
values.append(cell.Range.Text[:-2])
セル内文字列の整理
セル内の文字列は、Cell.Rangeプロパティで取得した
RangeオブジェクトのTextプロパティで取得できるのですが、
末尾に改行コードと、セルの区切りを表す制御文字が含まれているため、スライスで末尾2文字を削除しています。
values.append(cell.Range.Text[:-2])
末尾2文字を削除しない、
values.append(cell.Range.Text)
の形で実行した場合は、
['a1\r\x07', 'b1\r\x07', 'c1\r\x07']
['a2\r\x07', 'b2\r\x07', 'c2\r\x07']
のように出力されます。
最終更新日時:2020-10-07 06:53
Home » Python » pywin32・win32comの使い方 » pywin32でWordの表データを1行ずつリストに