現代のデータ駆動型ビジネスシーンでは、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()
ドキュメントプレビュー:
説明:
-
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()
ドキュメントプレビュー:
説明:
-
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()
ドキュメントプレビュー:
説明:
-
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()
ドキュメントプレビュー:
説明:
- ネストされた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()
ドキュメントプレビュー:
説明:
- 外側のループで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公式チュートリアルをご覧ください。




