大規模データ処理と情報抽出の分野では、Word文書は様々な機関や個人が一般的に使用する情報の保存形式です。これには、さまざまなレポート、アンケート結果、プロジェクト計画など、多くの構造化および半構造化データが含まれています。これらのドキュメントには、統計データ、プロジェクトの進捗状況、研究成果など、重要なデータ情報が含まれることがあります。しかし、大量のWord文書からこれらのテーブルを個別に抽出して整理することは、手間がかかり、ミスが生じやすく、効率的かつ正確なデータ利用ニーズを満たすことができません。したがって、Word文書からテーブルを一括抽出するためのプログラミングを利用することは、必要で効率的な解決策となります。Pythonは、強力で簡単に学習できるプログラミング言語として、この目標を効果的に達成することができます。それにより、データ収集と前処理の作業効率が大幅に向上し、さらにデータ分析とアプリケーションの後続処理に強力なサポートを提供します。この記事では、Pythonを使用してWord文書からテーブルを抽出する方法について説明します。
この記事で使用する方法には、Spire.Doc for Pythonが必要です。公式ウェブサイトから入手するか、PyPIでインストールできます:pip install Spire.Doc
。テーブルをExcelワークシートに保存する場合は、Spire.XLS for Pythonも必要です。PyPI:pip install Spire.XLS
。
Word文書のテーブルを抽出してExcelワークシートに保存する
Word文書からテーブルを読み取り、Excelワークブックに書き込むには、これらの2つのライブラリを同時に使用する必要があります。以下は手順です:
- Document オブジェクトと Workbook オブジェクトを作成します。
- Document クラスの LoadFromFile() メソッドを使用して、指定されたパスのWord文書を読み込みます。
- Workbook 内のすべてのワークシートをクリアします。
- 読み込んだWord文書のすべてのセクション(Sections)を反復処理します。
- 各セクション内で、含まれるすべてのテーブル(Tables)を反復処理します。
- 各テーブルに対して、新しいExcelワークシートを作成し、テーブルのインデックスに基づいて名前を付けます。
- テーブル内の各行(Rows)を反復処理し、現在の行オブジェクトを取得します。
- その行内のすべてのセル(Cells)を再度反復処理し、セルオブジェクトを取得します。
- 各セルについて、含まれる段落の内容を1つの文字列(cellText)に結合します。
- Workbook のワークシートオブジェクトの SetCellValue() メソッドを使用して、結合後のセルのテキスト内容を対応するワークシートに書き込みます。
- すべてのテーブルデータの書き込みが完了したら、Workbook の SaveToFile() メソッドを使用してExcelデータを指定されたパスに保存します。
コード例
from spire.doc import *
from spire.doc.common import *
from spire.xls import *
from spire.xls.common import *
# Documentオブジェクトの作成
doc = Document()
# Word文書の読み込み
doc.LoadFromFile("Sample.docx")
# Workbookオブジェクトの作成
wb = Workbook()
wb.Worksheets.Clear()
# 文書のセクションを反復処理する
for i in range(doc.Sections.Count):
# セクションの取得
section = doc.Sections.get_Item(i)
# セクション内のテーブルを反復処理する
for j in range(section.Tables.Count):
# テーブルの取得
table = section.Tables.get_Item(j)
# ワークシートの作成
ws = wb.Worksheets.Add(f"Table {(j + 1)}")
# テーブルのデータをワークシートに書き込む
for row in range(table.Rows.Count):
# 行の取得
tableRow = table.Rows.get_Item(row)
# 行内のセルを反復処理する
for cell in range(tableRow.Cells.Count):
# セルの取得
tableCell = tableRow.Cells.get_Item(cell)
# セルの内容を取得する
cellText = ""
for paragraph in range(tableCell.Paragraphs.Count):
paragraph = tableCell.Paragraphs.get_Item(paragraph)
cellText = cellText + paragraph.Text
# セルの内容をワークシートに書き込む
ws.SetCellValue(row + 1, cell + 1, cellText)
wb.SaveToFile("output/WordTableToExcel.xlsx", FileFormat.Version2016)
doc.Close()
wb.Dispose()
Word文書のテーブルを抽出してCSVファイルに保存する
CSVファイルはテキスト形式で表データを保存するため、Spire.Doc for Pythonを使用してWord文書からテーブルデータを直接抽出してCSVファイルに書き込むことができます。以下は手順です:
- Document オブジェクトを作成します。
- Document クラスの LoadFromFile() メソッドを使用して、指定されたパスのWord文書を読み込みます。
- 読み込まれたWord文書のすべてのセクション(Sections)を反復処理します。
- 各セクション内で、含まれるすべてのテーブル(Tables)を反復処理します。
- 各テーブルに対して、対応するCSVファイル名を生成し、このファイルを書き込みモードで開き、エンコーディングをUTF-8に設定し、改行モードを有効にします。
- CSVファイルの内容を書き込むために csv.writer オブジェクトを作成します。
- テーブルの列数に基づいて、CSVファイルのヘッダ行(列名)を動的に生成し、 writerow() メソッドを使用してCSVファイルに書き込みます。
- 現在のテーブルの各行(Rows)を反復処理し、現在の行オブジェクトを取得します。
- 各行の各セルについて、最初の段落のテキスト内容のみを抽出し、行のデータリストを作成します。
- csv.writer オブジェクトの writerow() メソッドを使用して、この行のデータリストを対応するCSVファイルに書き込みます。
- 1つのテーブルのすべてのデータの書き込みが完了したら、開いているCSVファイルを閉じます。
- 次のテーブルの処理に進み、すべてのテーブルを反復処理します。
コード例
import csv
from spire.doc import *
# Documentオブジェクトの作成
doc = Document()
# Word文書の読み込み
doc.LoadFromFile("Sample.docx")
# 文書のセクションを反復処理する
for i in range(doc.Sections.Count):
# セクションの取得
section = doc.Sections.get_Item(i)
# セクション内のテーブルを反復処理する
for j in range(section.Tables.Count):
# テーブルの取得
table = section.Tables.get_Item(j)
# CSVファイル名の作成とファイルのオープン
csv_file_name = f"Table_{(j + 1)}.csv"
with open(csv_file_name, 'w', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
# CSVファイルのヘッダー行(列名)を書き込む
headers = ["Column " + str(x+1) for x in range(table.Columns.Count)]
writer.writerow(headers)
# テーブルの各行を反復処理する
for row in range(table.Rows.Count):
# 行の取得
tableRow = table.Rows.get_Item(row)
# 行内の各セルの内容を読み取る(各セルの最初の段落のみを取得)
row_data = [tableRow.Cells.get_Item(cell).Paragraphs[0].Text for cell in range(tableRow.Cells.Count)]
# セルの内容をCSVファイルに書き込む
writer.writerow(row_data)
doc.Close()
以上の内容は、Pythonを使用してWord文書からテーブルを抽出し、ExcelワークシートまたはCSVファイルに変換する方法について説明しています。Spire.Doc for Pythonには他にも多くの機能がありますので、Spire.Doc for Pythonチュートリアルにアクセスしてください。APIの使用中に問題が発生した場合は、Spire.Docフォーラムで技術サポートを入手できます。