Pythonを使用してWord文書から表を一括抽出する方法

大規模データ処理と情報抽出の分野では、Word文書は様々な機関や個人が一般的に使用する情報の保存形式です。これには、さまざまなレポート、アンケート結果、プロジェクト計画など、多くの構造化および半構造化データが含まれています。これらのドキュメントには、統計データ、プロジェクトの進捗状況、研究成果など、重要なデータ情報が含まれることがあります。しかし、大量のWord文書からこれらのテーブルを個別に抽出して整理することは、手間がかかり、ミスが生じやすく、効率的かつ正確なデータ利用ニーズを満たすことができません。したがって、Word文書からテーブルを一括抽出するためのプログラミングを利用することは、必要で効率的な解決策となります。Pythonは、強力で簡単に学習できるプログラミング言語として、この目標を効果的に達成することができます。それにより、データ収集と前処理の作業効率が大幅に向上し、さらにデータ分析とアプリケーションの後続処理に強力なサポートを提供します。この記事では、**Pythonを使用してWord文書からテーブルを抽出する方法**について説明します。

- **[Word文書のテーブルを抽出してExcelワークシートに保存する](#word文書のテーブルを抽出してexcelワークシートに保存する)**
- **[Word文書のテーブルを抽出してCSVファイルに保存する](#word文書のテーブルを抽出してcsvファイルに保存する)**

この記事で使用する方法には、[Spire.Doc for Python](https://www.e-iceblue.com/Download/Spire-Doc-Python.html)が必要です。公式ウェブサイトから入手するか、PyPIでインストールできます：`pip install Spire.Doc`。テーブルをExcelワークシートに保存する場合は、[Spire.XLS for Python](https://www.e-iceblue.com/Download/Spire-XLS-Python.html)も必要です。PyPI：`pip install Spire.XLS`。

[無料ライセンスの申請](https://www.e-iceblue.com/TemLicense.html)

## Word文書のテーブルを抽出してExcelワークシートに保存する
Word文書からテーブルを読み取り、Excelワークブックに書き込むには、これらの2つのライブラリを同時に使用する必要があります。以下は手順です：

1. Document オブジェクトと Workbook オブジェクトを作成します。
2. Document クラスの LoadFromFile() メソッドを使用して、指定されたパスのWord文書を読み込みます。
3. Workbook 内のすべてのワークシートをクリアします。
4. 読み込んだWord文書のすべてのセクション（Sections）を反復処理します。
5. 各セクション内で、含まれるすべてのテーブル（Tables）を反復処理します。
6. 各テーブルに対して、新しいExcelワークシートを作成し、テーブルのインデックスに基づいて名前を付けます。
7. テーブル内の各行（Rows）を反復処理し、現在の行オブジェクトを取得します。
8. その行内のすべてのセル（Cells）を再度反復処理し、セルオブジェクトを取得します。
9. 各セルについて、含まれる段落の内容を1つの文字列（cellText）に結合します。
10. Workbook のワークシートオブジェクトの SetCellValue() メソッドを使用して、結合後のセルのテキスト内容を対応するワークシートに書き込みます。
11. すべてのテーブルデータの書き込みが完了したら、Workbook の SaveToFile() メソッドを使用してExcelデータを指定されたパスに保存します。

**コード例**
```python
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文書のテーブルを抽出してExcelワークシートに保存](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/cd289783-8ce6-eed6-2512-c21dc4b11cd3.png)

## Word文書のテーブルを抽出してCSVファイルに保存する
CSVファイルはテキスト形式で表データを保存するため、Spire.Doc for Pythonを使用してWord文書からテーブルデータを直接抽出してCSVファイルに書き込むことができます。以下は手順です：

1. Document オブジェクトを作成します。
2. Document クラスの LoadFromFile() メソッドを使用して、指定されたパスのWord文書を読み込みます。
3. 読み込まれたWord文書のすべてのセクション（Sections）を反復処理します。
4. 各セクション内で、含まれるすべてのテーブル（Tables）を反復処理します。
5. 各テーブルに対して、対応するCSVファイル名を生成し、このファイルを書き込みモードで開き、エンコーディングをUTF-8に設定し、改行モードを有効にします。
6. CSVファイルの内容を書き込むために csv.writer オブジェクトを作成します。
7. テーブルの列数に基づいて、CSVファイルのヘッダ行（列名）を動的に生成し、 writerow() メソッドを使用してCSVファイルに書き込みます。
8. 現在のテーブルの各行（Rows）を反復処理し、現在の行オブジェクトを取得します。
9. 各行の各セルについて、最初の段落のテキスト内容のみを抽出し、行のデータリストを作成します。
10. csv.writer オブジェクトの writerow() メソッドを使用して、この行のデータリストを対応するCSVファイルに書き込みます。
11. 1つのテーブルのすべてのデータの書き込みが完了したら、開いているCSVファイルを閉じます。
12. 次のテーブルの処理に進み、すべてのテーブルを反復処理します。

**コード例**
```python
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()
```

**抽出の結果**
![Word文書のテーブルを抽出してCSVファイルに保存](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/278784/a45646c4-7c7c-dff0-d8f7-e14ccf073762.png)

以上の内容は、Pythonを使用してWord文書からテーブルを抽出し、ExcelワークシートまたはCSVファイルに変換する方法について説明しています。Spire.Doc for Pythonには他にも多くの機能がありますので、[Spire.Doc for Pythonチュートリアル](https://www.e-iceblue.com/Tutorials/Python/Spire.Doc-for-Python/Program-Guide/Spire.Doc-for-Python-Program-Guide-Content.html)にアクセスしてください。APIの使用中に問題が発生した場合は、[Spire.Docフォーラム](https://www.e-iceblue.com/forum/spire-doc-f6.html)で技術サポートを入手できます。