0
0

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でJSONデータをWordに書き込む方法

0
Posted at

現代のデータ駆動型ビジネスシーンでは、JSONはAPIレスポンス、設定ファイル、データベースエクスポートなど、最も一般的なデータ交換形式として広く利用されています。しかし、これらの構造化データを非技術者向けに提供したり、正式なレポートとして提示する必要がある場合、JSONの原文をそのまま表示するのは適切ではありません。多くのユーザーがJSONデータを1つずつ手動でWordドキュメントにコピーしようとしますが、データ量が多い場合、構造が複雑な場合、または定期的な更新が必要な場合には、手動操作は非効率的であり、データの欠落やフォーマットの混乱などの問題が発生しやすくなります。

本記事では、Pythonを使用してJSONデータを読み取り、それを表や段落などの構造化された形式で自動的にWordドキュメントに書き込む方法を紹介します。このプロセス全体を自動化でき、APIデータレポート生成、設定ドキュメント出力、データベースエクスポートデータのフォーマット化、ビジネスデータの定期集計など、さまざまなシナリオに対応できます。

本記事で紹介する方法には Free Spire.Doc for Python が必要です。pipでインストールできます:

pip install spire.doc.free

1. JSONデータを読み取ってWord段落に書き込む

JSONデータが単純なキー・バリューペアの構造の場合、各フィールドを段落形式でWordドキュメントに書き込むことができます。これは設定説明書、個人情報カードなどのシナリオに適しています。

import json
from spire.doc import *
from spire.doc.common import *

# JSONデータ(実際のシナリオではファイルやAPIから取得)
json_data = {
    "プロジェクト名": "スマートシティデータプラットフォーム",
    "バージョン": "v3.2.1",
    "責任者": "田中太郎",
    "ステータス": "進行中",
    "開始日": "2024-01-15",
    "予定完了日": "2024-12-31",
    "技術スタック": "Python, Kafka, PostgreSQL, Docker",
    "概要": "IoTセンサーデータに基づいて都市レベルのリアルタイム監視・分析プラットフォームを構築し、交通、環境、エネルギーの3分野をカバーします。"
}

# Wordドキュメントを作成
document = Document()
section = document.AddSection()

# タイトルを追加
title = section.AddParagraph()
title_text = title.AppendText("プロジェクト情報概要")
title.Format.HorizontalAlignment = HorizontalAlignment.Center
title_text.CharacterFormat.FontName = "MS Gothic"
title_text.CharacterFormat.Bold = True
title_text.CharacterFormat.FontSize = 18
section.AddParagraph()

# JSONデータを反復処理し、1件ずつ段落に書き込む
for key, value in json_data.items():
    para = section.AddParagraph()
    text_range = para.AppendText(f"{key}{value}")
    text_range.CharacterFormat.FontSize = 12
    text_range.CharacterFormat.FontName = "MS Gothic"

# ドキュメントを保存
document.SaveToFile("ProjectInfo.docx", FileFormat.Docx)
document.Close()

ドキュメントプレビュー:

PythonでJSONキー・バリューペアをWord段落に書き込む

説明:

  • Document() でWordドキュメントオブジェクトを作成し、AddSection() でセクションを追加してコンテンツのコンテナとします。
  • JSON辞書のキー・バリューペアを反復処理し、AppendText() を使用して各フィールドを「キー:値」形式で段落に書き込みます。
  • CharacterFormat を使用してフォントとフォントサイズを設定し、ドキュメントのスタイルを統一します。

この方法は、データ量が少なく、構造がフラットなJSONデータの表示に適しています。


2. JSON配列データをWord表に書き込む

実際のビジネスでは、JSONデータは従業員リスト、注文記録、製品カタログなど、配列形式で存在することがよくあります。この場合、データをWord表に書き込むのが最も直感的で専門的な表示方法です。

2.1 基本表:従業員情報リスト

import json
from spire.doc import *
from spire.doc.common import *

# JSON配列データ
json_employees = [
    {"氏名": "佐藤健一", "部署": "技術部", "職位": "シニアエンジニア", "入社日": "2020-03-15", "給与": "500,000円"},
    {"氏名": "鈴木美咲", "部署": "営業部", "職位": "営業マネージャー", "入社日": "2019-06-20", "給与": "480,000円"},
    {"氏名": "高橋誠", "部署": "人事部", "職位": "人事担当", "入社日": "2021-01-10", "給与": "350,000円"},
    {"氏名": "伊藤麻衣", "部署": "経理部", "職位": "経理チーフ", "入社日": "2018-11-05", "給与": "450,000円"},
    {"氏名": "渡辺大輔", "部署": "技術部", "職位": "プロダクトマネージャー", "入社日": "2020-08-22", "給与": "520,000円"},
]

# Wordドキュメントを作成
document = Document()
section = document.AddSection()

# タイトルを追加
title = section.AddParagraph()
title_text = title.AppendText("従業員情報表")
title.Format.HorizontalAlignment = HorizontalAlignment.Center
title_text.CharacterFormat.Bold = True
title_text.CharacterFormat.FontSize = 18
section.AddParagraph()

# ヘッダーを抽出(JSONオブジェクトのすべてのキー)
headers = list(json_employees[0].keys())

# 表を作成
table = section.AddTable(True)
table.ResetCells(len(json_employees) + 1, len(headers))

# ヘッダー行を設定
header_row = table.Rows[0]
header_row.IsHeader = True
header_row.Height = 30
header_row.HeightType = TableRowHeightType.Exactly

for i, header in enumerate(headers):
    cell = header_row.Cells[i]
    cell.CellFormat.VerticalAlignment = VerticalAlignment.Middle
    cell.CellFormat.Shading.BackgroundPatternColor = Color.get_Gray()
    paragraph = cell.AddParagraph()
    paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
    text_range = paragraph.AppendText(header)
    text_range.CharacterFormat.Bold = True
    text_range.CharacterFormat.FontSize = 12

# データ行を埋める
for row_idx, employee in enumerate(json_employees):
    data_row = table.Rows[row_idx + 1]
    data_row.Height = 25
    data_row.HeightType = TableRowHeightType.Exactly

    for col_idx, key in enumerate(headers):
        cell = data_row.Cells[col_idx]
        cell.CellFormat.VerticalAlignment = VerticalAlignment.Middle
        cell.CellFormat.Shading.BackgroundPatternColor = Color.Empty()
        paragraph = cell.AddParagraph()
        paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
        paragraph.AppendText(str(employee[key]))

# 交互行の色分けを設定
for row_idx in range(1, table.Rows.Count):
    if row_idx % 2 == 0:
        row = table.Rows[row_idx]
        for i in range(row.Cells.Count):
            row.Cells[i].CellFormat.Shading.BackgroundPatternColor = Color.get_LightBlue()

# ドキュメントを保存
document.SaveToFile("EmployeeJsonTable.docx", FileFormat.Docx)
document.Close()

ドキュメントプレビュー:

PythonでJSON配列をWord表に書き込む

説明:

  • list(json_employees[0].keys()) でJSONオブジェクトのキーを動的に抽出してヘッダーとし、列名をハードコーディングする必要がありません。
  • ResetCells() でデータ行数と列数に基づいて表構造を初期化します。
  • ヘッダー行に灰色の背景と太字を設定し、データ行は中央揃えにし、読みやすさを向上させるために交互行の色分けを実装します。

2.2 スタイル付き表:四半期売上データ

JSONデータが正式なレポートで使用される場合、プリセットスタイルと罫線設定をさらに適用して、表をより専門的にすることができます:

import json
from spire.doc import *
from spire.doc.common import *

# JSON売上データ
json_sales = [
    {"製品名": "ノートパソコン", "第1四半期": "1億2,000万円", "第2四半期": "1億3,500万円", "第3四半期": "1億5,000万円", "第4四半期": "1億6,800万円"},
    {"製品名": "タブレット", "第1四半期": "8,500万円", "第2四半期": "9,200万円", "第3四半期": "1億500万円", "第4四半期": "1億1,800万円"},
    {"製品名": "スマートフォン", "第1四半期": "2億円", "第2四半期": "2億2,000万円", "第3四半期": "2億4,500万円", "第4四半期": "2億8,000万円"},
    {"製品名": "スマートウォッチ", "第1四半期": "4,500万円", "第2四半期": "5,200万円", "第3四半期": "6,000万円", "第4四半期": "7,200万円"},
]

# Wordドキュメントを作成
document = Document()
section = document.AddSection()

# タイトルを追加
title = section.AddParagraph()
title_text = title.AppendText("2024年度四半期売上レポート")
title.Format.HorizontalAlignment = HorizontalAlignment.Center
title_text.CharacterFormat.Bold = True
title_text.CharacterFormat.FontSize = 18
section.AddParagraph()

# ヘッダーを抽出
headers = list(json_sales[0].keys())

# 表を作成
table = section.AddTable(True)
table.ResetCells(len(json_sales) + 1, len(headers))

# ヘッダーを埋める
for i, header in enumerate(headers):
    cell = table.Rows[0].Cells[i]
    cell.CellFormat.VerticalAlignment = VerticalAlignment.Middle
    cell.CellFormat.Shading.BackgroundPatternColor = Color.get_DarkSeaGreen()
    paragraph = cell.AddParagraph()
    paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
    text_range = paragraph.AppendText(header)
    text_range.CharacterFormat.Bold = True
    text_range.CharacterFormat.FontSize = 12
    text_range.CharacterFormat.TextColor = Color.get_White()

# データを埋める
for row_idx, item in enumerate(json_sales):
    for col_idx, key in enumerate(headers):
        cell = table.Rows[row_idx + 1].Cells[col_idx]
        cell.CellFormat.VerticalAlignment = VerticalAlignment.Middle
        paragraph = cell.AddParagraph()
        paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
        paragraph.AppendText(str(item[key]))

# プリセット表スタイルを適用
table.ApplyStyle(DefaultTableStyle.ColorfulListAccent1)

# 罫線を設定
table.Format.Borders.BorderType = BorderStyle.Single
table.Format.Borders.LineWidth = 1.0
table.Format.Borders.Color = Color.get_Black()

# ドキュメントを保存
document.SaveToFile("SalesJsonReport.docx", FileFormat.Docx)
document.Close()

ドキュメントプレビュー:

PythonでJSONデータをWordスタイル付き表に書き込む

説明:

  • ApplyStyle(DefaultTableStyle.ColorfulListAccent1) でプリセットの表スタイルを適用し、迅速に専門的な外観を実現します。
  • Format.Borders プロパティを使用して罫線のスタイルをカスタマイズし、罫線タイプ、線幅、色を含みます。
  • ヘッダーは濃い緑色の背景に白い太字を使用し、視覚的な階層性を強化します。

3. ネストされたJSONデータの処理:セル結合表

実際のビジネスにおけるJSONデータは、カテゴリ情報を含む製品カタログなど、ネストされた構造を持つことがよくあります。セルを結合して階層関係を表示できます:

import json
from spire.doc import *
from spire.doc.common import *

# ネストされたJSONデータ
json_catalog = {
    "電子機器": [
        {"型番": "SP-2024", "名称": "スマートフォン", "価格": "89,800円"},
        {"型番": "TB-2024", "名称": "タブレット", "価格": "69,800円"},
    ],
    "家庭用品": [
        {"型番": "RC-2024", "名称": "炊飯器", "価格": "15,800円"},
        {"型番": "AP-2024", "名称": "空気清浄機", "価格": "32,800円"},
    ],
    "オフィス用品": [
        {"型番": "PR-2024", "名称": "プリンター", "価格": "35,800円"},
        {"型番": "SH-2024", "名称": "シュレッダー", "価格": "12,800円"},
    ],
}

# Wordドキュメントを作成
document = Document()
section = document.AddSection()

# タイトルを追加
title = section.AddParagraph()
title_text = title.AppendText("製品カタログ")
title.Format.HorizontalAlignment = HorizontalAlignment.Center
title_text.CharacterFormat.Bold = True
title_text.CharacterFormat.FontSize = 18
section.AddParagraph()

# 総行数を計算(ヘッダー1行 + 各カテゴリの製品行数)
total_rows = 1 + sum(len(items) for items in json_catalog.values())
col_count = 4  # カテゴリ + 型番 + 名称 + 価格

# 表を作成
table = section.AddTable(True)
table.ResetCells(total_rows, col_count)

# ヘッダーを埋める
headers = ["カテゴリ", "型番", "名称", "価格"]
for i, header in enumerate(headers):
    cell = table.Rows[0].Cells[i]
    cell.CellFormat.VerticalAlignment = VerticalAlignment.Middle
    cell.CellFormat.Shading.BackgroundPatternColor = Color.get_Gray()
    paragraph = cell.AddParagraph()
    paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
    text_range = paragraph.AppendText(header)
    text_range.CharacterFormat.Bold = True

# カテゴリデータを埋めてカテゴリ列のセルを結合
current_row = 1
for category, items in json_catalog.items():
    start_row = current_row
    for item in items:
        row = table.Rows[current_row]
        row.Cells[1].AddParagraph().AppendText(item["型番"])
        row.Cells[2].AddParagraph().AppendText(item["名称"])
        row.Cells[3].AddParagraph().AppendText(item["価格"])
        current_row += 1

    # カテゴリ列にカテゴリ名を書き込む
    table.Rows[start_row].Cells[0].AddParagraph().AppendText(category)

    # このカテゴリに複数行がある場合、カテゴリ列のセルを結合
    if len(items) > 1:
        table.ApplyVerticalMerge(0, start_row, start_row + len(items) - 1)

    # カテゴリ列のセルを中央揃えに設定
    table.Rows[start_row].Cells[0].CellFormat.VerticalAlignment = VerticalAlignment.Middle
    table.Rows[start_row].Cells[0].Paragraphs[0].Format.HorizontalAlignment = HorizontalAlignment.Center

# 表スタイルを適用
table.ApplyStyle(DefaultTableStyle.ColorfulGridAccent3)

# ドキュメントを保存
document.SaveToFile("CatalogJsonTable.docx", FileFormat.Docx)
document.Close()

ドキュメントプレビュー:

PythonでネストされたJSONデータをWord結合セル表に書き込む

説明:

  • ネストされたJSON辞書を反復処理し、各カテゴリは一組の製品データに対応します。
  • ApplyVerticalMerge() メソッドで同じカテゴリのセルを縦方向に結合し、階層関係を明確に表示します。
  • ApplyStyle(DefaultTableStyle.ColorfulGridAccent3) でプリセットスタイルを適用し、表の外観をより専門的にします。

4. JSONファイルから複数の表を一括書き込み

実際のアプリケーションでは、JSONデータはファイルやAPIから取得され、複数のデータセットを含む可能性があります。次の例は、JSONファイルからデータを読み取り、同じWordドキュメントに複数の表を一括で書き込む方法を示しています:

import json
from spire.doc import *
from spire.doc.common import *

# JSONファイルから読み取ったデータをシミュレート(実際のシナリオではjson.load()を使用)
json_file_data = {
    "従業員情報": [
        {"氏名": "山田太郎", "部署": "技術部", "職位": "エンジニア"},
        {"氏名": "田中美咲", "部署": "営業部", "職位": "マネージャー"},
        {"氏名": "佐藤誠", "部署": "経理部", "職位": "会計担当"},
    ],
    "プロジェクト一覧": [
        {"プロジェクト": "データプラットフォーム", "ステータス": "進行中", "進捗": "75%"},
        {"プロジェクト": "モバイルアプリ", "ステータス": "完了", "進捗": "100%"},
        {"プロジェクト": "AIモデル", "ステータス": "計画段階", "進捗": "10%"},
    ],
    "機器リスト": [
        {"機器": "サーバーA", "IP": "192.168.1.10", "ステータス": "稼働中"},
        {"機器": "サーバーB", "IP": "192.168.1.11", "ステータス": "保守中"},
        {"機器": "スイッチングハブ", "IP": "192.168.1.1", "ステータス": "稼働中"},
    ],
}

# Wordドキュメントを作成
document = Document()
section = document.AddSection()

# ドキュメントタイトルを追加
doc_title = section.AddParagraph()
doc_title_text = doc_title.AppendText("データ集計レポート")
doc_title.Format.HorizontalAlignment = HorizontalAlignment.Center
doc_title_text.CharacterFormat.Bold = True
doc_title_text.CharacterFormat.FontSize = 22
section.AddParagraph()

# 各データセットを反復処理し、対応する表を作成
for table_name, records in json_file_data.items():
    # 表タイトルを追加
    table_title = section.AddParagraph()
    table_title_text = table_title.AppendText(table_name)
    table_title_text.CharacterFormat.Bold = True
    table_title_text.CharacterFormat.FontSize = 14
    section.AddParagraph()

    # ヘッダーを抽出
    headers = list(records[0].keys())

    # 表を作成
    table = section.AddTable(True)
    table.ResetCells(len(records) + 1, len(headers))

    # ヘッダーを埋める
    for i, header in enumerate(headers):
        cell = table.Rows[0].Cells[i]
        cell.CellFormat.VerticalAlignment = VerticalAlignment.Middle
        cell.CellFormat.Shading.BackgroundPatternColor = Color.get_Gray()
        paragraph = cell.AddParagraph()
        paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
        text_range = paragraph.AppendText(header)
        text_range.CharacterFormat.Bold = True

    # データを埋める
    for row_idx, record in enumerate(records):
        for col_idx, key in enumerate(headers):
            cell = table.Rows[row_idx + 1].Cells[col_idx]
            cell.CellFormat.VerticalAlignment = VerticalAlignment.Middle
            paragraph = cell.AddParagraph()
            paragraph.Format.HorizontalAlignment = HorizontalAlignment.Center
            paragraph.AppendText(str(record[key]))

    # 表スタイルを適用
    table.ApplyStyle(DefaultTableStyle.ColorfulListAccent1)
    table.AutoFit(AutoFitBehaviorType.AutoFitToWindow)

    # 区切り用の空行を追加
    section.AddParagraph()

# ドキュメントを保存
document.SaveToFile("JsonDataReport.docx", FileFormat.Docx)
document.Close()

ドキュメントプレビュー:

PythonでJSONファイルから複数のWord表を一括書き込み

説明:

  • 外側のループでJSON内の各データセットを反復処理し、各データセットに対して独立した表を作成します。
  • 各表の前にタイトル段落を追加し、表の間には空行を入れて区切り、ドキュメント構造を明確にします。
  • AutoFit(AutoFitBehaviorType.AutoFitToWindow) で表がページ幅に自動的に適合するようにします。
  • 実際の使用時には、json.load() を使用して .json ファイルからデータを読み取り、サンプルデータを置き換えることができます。

主要クラスとメソッドの解説

クラス / メソッド / プロパティ 説明
Document Wordドキュメントオブジェクト。ドキュメントの作成、読み込み、保存をサポート
Document.AddSection() ドキュメントセクションを追加し、表や段落のコンテナとして機能
Document.SaveToFile() ドキュメントを指定のファイルパスに保存
Section.AddTable() セクション内に新しい表を作成
Section.AddParagraph() セクション内に段落を追加
Table.ResetCells(rows, cols) 行数と列数に基づいて表構造を初期化
Table.ApplyStyle() プリセットの表スタイルを適用
Table.ApplyHorizontalMerge() セルを水平方向に結合
Table.ApplyVerticalMerge() セルを垂直方向に結合
Table.AutoFit() 表の幅を自動調整
Table.Rows 表の行コレクションを取得
TableRow.Cells 行内のセルコレクションを取得
TableRow.IsHeader 行をヘッダー行としてマーク
Cell.AddParagraph() セル内に段落を追加
Cell.CellFormat セル書式オブジェクトを取得
CellFormat.Shading.BackgroundPatternColor セルの背景色を設定
CellFormat.VerticalAlignment セルの垂直方向の配置を設定
Paragraph.AppendText() 段落にテキストを追加
Paragraph.Format.HorizontalAlignment 段落の水平方向の配置を設定
TextRange.CharacterFormat テキスト書式オブジェクトを取得
CharacterFormat.Bold テキストを太字にするかどうかを設定
CharacterFormat.FontSize フォントサイズを設定
CharacterFormat.FontName フォント名を設定
DefaultTableStyle プリセット表スタイルの列挙型
AutoFitBehaviorType 表の自動調整動作の列挙型
FileFormat ファイル形式の列挙型

まとめ

本記事の例を通じて、Pythonを使用してJSONデータをさまざまな形式でWordドキュメントに書き込む方法を理解できました。単純なキー・バリューペアの段落表示から、構造化された表の生成、ネストされたデータの結合セル処理、複数のデータセットの一括書き込みまで、プロセス全体は高度に自動化されており、APIデータレポート、設定ドキュメント出力、ビジネスデータの定期集計などのシナリオに特に適しています。

手動でのコピー&ペーストやオンライン変換ツールと比較して、コード方式はバッチ処理、フォーマットの統一、繰り返し実行などの利点があります。これを基盤に、REST APIからリアルタイムでJSONデータを取得してレポートを生成する、スケジュールタスクと組み合わせてドキュメント更新を自動化する、チャート可視化を追加するなど、さらに多くの機能を拡張できます。

大量の構造化データのドキュメント生成ニーズを処理している場合、このPythonベースのソリューションは作業効率を大幅に向上させます。Pythonを使用したWordドキュメント操作の詳細については、Spire.Doc for Python公式チュートリアルをご覧ください。

0
0
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
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?