1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Last updated at Posted at 2024-03-11

大規模データ処理と情報抽出の分野では、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つのライブラリを同時に使用する必要があります。以下は手順です:

  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データを指定されたパスに保存します。

コード例

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ワークシートに保存

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. 次のテーブルの処理に進み、すべてのテーブルを反復処理します。

コード例

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ファイルに保存

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?