チュートリアル

簡単にライブラリーを使用するためのチュートリアルコレクション

チュートリアル»Java»Spire.XLS for Java»変換»Java で JSON を Excel に変換する(XLS・XLSX 対応)
2026-07-10

Java で JSON を Excel に変換する(XLS・XLSX 対応)

Convert JSON data to Excel in Java with Spire.XLS

JSON は、REST API、Web サービス、エンタープライズアプリケーションにおけるデータ交換の標準形式として広く利用されています。しかし、ビジネスユーザーはレポート作成、フィルタリング、データ分析のために Excel を使用することを好むケースがほとんどです。そのため、API レスポンスのエクスポート、レポート生成、構造化データを技術知識のないユーザーと共有する際に、Java で JSON を Excel に変換する必要が生じることがよくあります。

Java にはいくつかの JSON ライブラリがありますが、データを適切に構造化された Excel ファイルに変換するには、列ヘッダー、セルのデータ型、行の反復処理、出力形式への対応など、多くの作業が必要です。Spire.XLS for Javaを利用すれば、Microsoft Office に依存せずに Excel ワークブックを作成できるクリーンな API で、こうした作業を簡単に処理できます。

本記事では、Spire.XLS for Javaと Jackson を使用して、Java で JSON を Excel に変換する方法を解説します。JSON 配列の変換、ネストされた JSON の処理、JSON ファイルの読み込み、XLSX・XLS 形式でのエクスポート、列幅の自動調整、書式設定、大規模データセットの扱い方まで幅広く紹介します。

クイックナビ

  1. Java で JSON を Excel に変換する理由
  2. Spire.XLS for Java のインストール
  3. JSON データの準備
  4. Java で JSON を Excel に変換する手順
  5. JSON を Excel に変換する Java の完全コード
  6. Java で JSON を XLSX にエクスポートする
  7. Java でネストされた JSON を Excel に変換する
  8. JSON ファイルを Excel に変換する
  9. Excel の行と列を自動調整する
  10. エクスポートした Excel ファイルに書式を適用する
  11. JSON を Excel に変換する際のよくある課題
  12. JSON から Excel の変換に Spire.XLS for Java を選ぶ理由
  13. まとめ
  14. よくある質問

1. Java で JSON を Excel に変換する理由

JSON は軽量でマシンが処理しやすい形式であり、REST API、Web サービス、エンタープライズアプリケーションにおけるデータ交換に広く使用されています。しかし、ビジネスユーザーはレポート作成、フィルタリング、データ可視化、詳細分析のために Excel ファイルを必要とすることが一般的です。

Java で JSON を Excel に変換することで、バックエンドシステムとビジネスワークフローのギャップを埋めることができます。代表的なユースケースは以下の通りです。

API データのエクスポート

多くの REST API は JSON 形式でレスポンスを返します。これらのレスポンスを Excel に変換すれば、ユーザーは生の JSON を手動で処理することなく、データの確認、フィルタリング、分析が行えます。

レポートの生成

Java アプリケーションでは、API、データベース、その他のソースから取得した JSON データを、ヘッダー、書式設定、整理されたテーブルを含む構造化された Excel レポートに変換できます。

構造化データの共有

Excel ファイルは、グラフ、数式、ピボットテーブルなどの機能を使用して、データの配布や分析が容易に行えます。JSON データを Excel にエクスポートすることで、技術知識のないユーザーもこうした機能を活用できます。


2. Spire.XLS for Java のインストール

Java で JSON を Excel に変換する前に、プロジェクトに以下の依存関係を設定します。

Maven 依存関係

Spire.XLS for Javaは e-iceblue の Maven リポジトリから利用できます。リポジトリと依存関係をpom.xmlに追加します。

<repositories>
    <repository>
        <id>com.e-iceblue</id>
        <name>e-iceblue</name>
        <url>https://repo.e-iceblue.com/nexus/content/groups/public/</url>
    </repository>
</repositories>

<dependency>
    <groupId>e-iceblue</groupId>
    <artifactId>spire.xls</artifactId>
    <version>16.6.5</version>
</dependency>

Spire.XLS for Java をダウンロードして、JAR ファイルをプロジェクトに手動で追加することもできます。

JSON ライブラリの追加

Java には標準の JSON サポートが組み込まれていません。本記事では、Java エコシステムで最も広く利用されている JSON 処理ライブラリである Jackson を使用します。

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.17.2</version>
</dependency>

必要なクラスをインポートする

Java ソースファイルに以下のインポート文を追加します。

import com.spire.xls.*;
import com.spire.xls.core.spreadsheet.collections.AutoFitType;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
import java.util.Map;

3. JSON データの準備

変換プロセスの説明のため、シンプルな JSON 配列を使用します。各オブジェクトは 1 行を表し、各プロパティは 1 列を表します。これは REST API のレスポンスやデータエクスポートのワークフローで最もよく遭遇する JSON 構造です。

例:シンプルな JSON 配列

[
  {
    "ID": 1,
    "Name": "田中太郎",
    "Department": "営業部",
    "Salary": 7500000,
    "HireDate": "2022-03-15"
  },
  {
    "ID": 2,
    "Name": "佐藤花子",
    "Department": "マーケティング部",
    "Salary": 6800000,
    "HireDate": "2021-07-01"
  },
  {
    "ID": 3,
    "Name": "鈴木一郎",
    "Department": "開発部",
    "Salary": 9200000,
    "HireDate": "2023-01-10"
  }
]

JSON と Excel の対応関係は以下の通りです。

  • 各 JSON オブジェクトはスプレッドシートのになる
  • 各プロパティキーは列ヘッダーになる
  • 各プロパティ値は対応する行と列のセル値になる

この対応関係を理解しておくことで、以降のコード例をスムーズに理解できます。


4. Java で JSON を Excel に変換する手順

変換プロセスは、ワークブックの作成、ワークシートの取得、JSON データの解析、列ヘッダーの書き込み、セル値の設定という 5 つのステップで構成されます。本节では、完全なコードを示す前に、各ステップを個別に解説します。

ステップ 1:ワークブックを作成する

Workbookクラスは Excel ファイルを表します。このクラスをインスタンス化して、新しい空のワークブックを作成します。

Workbook workbook = new Workbook();

ステップ 2:ワークシートを作成する

ワークブックには 1 つ以上のワークシートが含まれます。デフォルトで作成される最初のワークシートにアクセスし、必要に応じて名前を変更します。

Worksheet sheet = workbook.getWorksheets().get(0);
sheet.setName("社員データ");

ステップ 3:JSON データを読み込む

Jackson のObjectMapperを使用して、JSON 文字列をJsonNodeツリーとして解析します。ルート要素が JSON 配列の場合は、ArrayNodeにキャストして反復処理を行います。

ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode = mapper.readTree(jsonString);

if (!rootNode.isArray()) {
    throw new IllegalArgumentException("ルートレベルにJSON配列が必要です");
}
ArrayNode jsonArray = (ArrayNode) rootNode;

ステップ 4:JSON キーを列ヘッダーとして書き込む

最初の JSON オブジェクトからフィールド名を抽出し、ワークシートの最初の行に書き込みます。Spire.XLS の行と列のインデックスは 1 から始まります。

JsonNode firstObject = jsonArray.get(0);
int col = 1;
for (Iterator<Map.Entry<String, JsonNode>> it = firstObject.fields(); it.hasNext(); ) {
    Map.Entry<String, JsonNode> entry = it.next();
    sheet.get(1, col).setValue(entry.getKey());
    col++;
}

ステップ 5:JSON 値を Excel セルに書き込む

配列内の各 JSON オブジェクトを反復処理し、それぞれの値を対応する行に書き込みます。1 行目はヘッダーが含まれるため、2 行目から開始します。

for (int i = 0; i < jsonArray.size(); i++) {
    JsonNode record = jsonArray.get(i);
    int dataRow = i + 2;
    int dataCol = 1;
    for (Iterator<Map.Entry<String, JsonNode>> it = record.fields(); it.hasNext(); ) {
        Map.Entry<String, JsonNode> entry = it.next();
        JsonNode value = entry.getValue();
        if (value.isNumber()) {
            sheet.get(dataRow, dataCol).setNumberValue(value.doubleValue());
        } else if (value.isBoolean()) {
            sheet.get(dataRow, dataCol).setBooleanValue(value.booleanValue());
        } else {
            sheet.get(dataRow, dataCol).setValue(value.asText());
        }
        dataCol++;
    }
}

この方法ではデータ型が保持されます。数値やブール値は文字列ではなく型付きのセル値として書き込まれるため、生成される Excel ファイルで数値の並べ替え、フィルタリング、数式計算が正しく機能します。


5. JSON を Excel に変換する Java の完全コード

以下は、JSON 文字列を読み込んで Excel ファイルに変換する完全な実行可能プログラムです。JSON を Excel に変換するJava コードの全体像を示します。

import com.spire.xls.*;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import java.io.File;
import java.util.Iterator;
import java.util.Map;

public class JsonToExcelConverter {

    public static void main(String[] args) {

        // サンプル JSON データ — 社員レコードの配列
        String jsonString = "["
            + "{\"ID\":1,\"Name\":\"田中太郎\",\"Department\":\"営業部\",\"Salary\":7500000,\"HireDate\":\"2022-03-15\"},"
            + "{\"ID\":2,\"Name\":\"佐藤花子\",\"Department\":\"マーケティング部\",\"Salary\":6800000,\"HireDate\":\"2021-07-01\"},"
            + "{\"ID\":3,\"Name\":\"鈴木一郎\",\"Department\":\"開発部\",\"Salary\":9200000,\"HireDate\":\"2023-01-10\"}"
            + "]";

        try {
            // JSON 文字列を JsonNode ツリーに解析する
            ObjectMapper mapper = new ObjectMapper();
            JsonNode rootNode = mapper.readTree(jsonString);

            if (!rootNode.isArray()) {
                throw new IllegalArgumentException("ルートレベルにJSON配列が必要です");
            }
            ArrayNode jsonArray = (ArrayNode) rootNode;

            // 新しいワークブックを作成し、最初のワークシートを取得する
            Workbook workbook = new Workbook();
            Worksheet sheet = workbook.getWorksheets().get(0);
            sheet.setName("社員データ");

            // 最初の JSON オブジェクトのキーを列ヘッダーとして書き込む
            JsonNode firstObject = jsonArray.get(0);
            int col = 1;
            for (Iterator<Map.Entry<String, JsonNode>> it = firstObject.fields(); it.hasNext(); ) {
                Map.Entry<String, JsonNode> entry = it.next();
                sheet.get(1, col).setValue(entry.getKey());
                col++;
            }

            // JSON 値からデータ行を書き込む
            for (int i = 0; i < jsonArray.size(); i++) {
                JsonNode record = jsonArray.get(i);
                int dataRow = i + 2;
                int dataCol = 1;

                for (Iterator<Map.Entry<String, JsonNode>> it = record.fields(); it.hasNext(); ) {
                    Map.Entry<String, JsonNode> entry = it.next();
                    JsonNode value = entry.getValue();

                    // データ型を保持する:数値とブール値は型付きセルとして書き込む
                    if (value.isNumber()) {
                        sheet.get(dataRow, dataCol).setNumberValue(value.doubleValue());
                    } else if (value.isBoolean()) {
                        sheet.get(dataRow, dataCol).setBooleanValue(value.booleanValue());
                    } else {
                        sheet.get(dataRow, dataCol).setValue(value.asText());
                    }
                    dataCol++;
                }
            }

            // 読みやすさのために列幅を自動調整する
            sheet.getAllocatedRange().autoFitColumns();

            // ワークブックを XLSX ファイルとして保存する
            workbook.saveToFile("EmployeeData.xlsx", ExcelVersion.Version2016);
            System.out.println("JSONをExcelに正常に変換しました。");

            // リソースを解放する
            workbook.dispose();

        } catch (Exception e) {
            System.err.println("JSONからExcelへの変換中にエラーが発生しました: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

プログラムを実行すると、JSON データが Excel ワークシートに変換されます。生成されるEmployeeData.xlsxファイルには、データ型が保持された社員レコードと、自動調整された列幅が含まれます。

JSON data converted to an Excel spreadsheet in Java

Spire.XLS の主要クラスとメソッド

  • Workbook — Excel ファイルを表します。ワークブックの作成、ワークシートの管理、ファイルの保存を処理します。
  • Worksheet — ワークブック内の 1 つのシートを表します。セル、行、列へのアクセスを提供します。
  • get(int row, int column) — 指定されたセルのCellRangeオブジェクトを返します。行と列のインデックスは 1 から始まります。
  • setValue(String) — セルの値を文字列として設定します。テキストやヘッダーに使用します。
  • setNumberValue(double) — セルの値を数値として設定します。数値型が保持されるため、計算に使用できます。
  • setBooleanValue(boolean) — セルの値をブール値(TRUE/FALSE)として設定します。
  • saveToFile(String, ExcelVersion) — ワークブックを指定された Excel 形式のファイルに保存します。
  • dispose() — ワークブックが保持するアンマネージリソースを解放します。

Excel ファイルを JSON 形式に逆変換する必要がある場合は、Spire.XLS for Java を使用したJava で Excel を JSON に変換する方法のガイドもご参照ください。


6. Java で JSON を XLSX にエクスポートする

Spire.XLS for Java は、最新の XLSX 形式(Excel 2007 以降)と従来の XLS 形式(Excel 97~2003)の両方に対応しています。saveToFile()に適切なExcelVersion列挙値を渡すことで、出力形式を切り替えられます。

XLSX として保存

// 最新の Excel 形式(.xlsx)にエクスポートする
workbook.saveToFile("EmployeeData.xlsx", ExcelVersion.Version2016);

XLS として保存

// 従来の Excel 形式(.xls)にエクスポートする
workbook.saveToFile("EmployeeData.xls", ExcelVersion.Version97to2003);
形式 説明 用途
XLSX 最新の Excel 形式(Excel 2007 以降) デフォルトの選択。ファイルサイズが小さく、全機能を利用可能
XLS 従来の Excel 形式(Excel 97~2003) 旧システムとの互換性確保

同じワークブックオブジェクトをどちらの形式でも保存できます。ファイル拡張子とバージョンパラメータを変更するだけで、コードのその他の変更は不要です。これは、アプリケーションが最新環境とレガシー環境の両方に対応する必要がある場合に特に便利です。

形式の変換やレガシーアップグレードが必要な場合のJava で XLS と XLSX 形式を相互変換する方法もご参照ください。


7. Java でネストされた JSON を Excel に変換する

実際の JSON データには、ネストされたオブジェクトや配列が含まれることがよくあります。ネストされた JSON を Excel に書き込むには、階層構造を表形式にフラット化する必要があります。各ネストされたフィールドを個別の列として展開します。

以下の JSON データは、連絡先情報を含むネストされた構造を持つ社員レコードです。

[
  {
    "ID": 1,
    "Name": "田中太郎",
    "Department": "営業部",
    "Contact": {
      "Email": "このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。",
      "Phone": "03-1234-5678"
    }
  },
  {
    "ID": 2,
    "Name": "佐藤花子",
    "Department": "マーケティング部",
    "Contact": {
      "Email": "このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。",
      "Phone": "06-9876-5432"
    }
  }
]

Contactオブジェクトをフラット化して、EmailPhoneを個別の列として展開します。

ID Name Department Contact.Email Contact.Phone
1 田中太郎 営業部 このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。 03-1234-5678
2 佐藤花子 マーケティング部 このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。 06-9876-5432

以下のコードでは、再帰的なフラット化アプローチを使用して、任意のネスト深度に対応します。

import com.spire.xls.*;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;

public class NestedJsonToExcel {

    public static void main(String[] args) {

        String jsonString = "["
            + "{\"ID\":1,\"Name\":\"田中太郎\",\"Department\":\"営業部\","
            + "\"Contact\":{\"Email\":\"このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。\",\"Phone\":\"03-1234-5678\"}},"
            + "{\"ID\":2,\"Name\":\"佐藤花子\",\"Department\":\"マーケティング部\","
            + "\"Contact\":{\"Email\":\"このメールアドレスはスパムボットから保護されています。閲覧するにはJavaScriptを有効にする必要があります。\",\"Phone\":\"06-9876-5432\"}}"
            + "]";

        try {
            ObjectMapper mapper = new ObjectMapper();
            ArrayNode jsonArray = (ArrayNode) mapper.readTree(jsonString);

            Workbook workbook = new Workbook();
            Worksheet sheet = workbook.getWorksheets().get(0);
            sheet.setName("社員一覧");

            // 最初のオブジェクトをフラット化して、ネストされたキーを含む全列ヘッダーを取得する
            LinkedHashMap<String, String> firstFlat = flattenJson(jsonArray.get(0), "");
            int col = 1;
            for (String key : firstFlat.keySet()) {
                sheet.get(1, col).setValue(key);
                col++;
            }

            // データ行を書き込む
            for (int i = 0; i < jsonArray.size(); i++) {
                LinkedHashMap<String, String> flat = flattenJson(jsonArray.get(i), "");
                int dataRow = i + 2;
                int dataCol = 1;
                for (String key : firstFlat.keySet()) {
                    String value = flat.getOrDefault(key, "");
                    sheet.get(dataRow, dataCol).setValue(value);
                    dataCol++;
                }
            }

            sheet.getAllocatedRange().autoFitColumns();
            workbook.saveToFile("NestedEmployees.xlsx", ExcelVersion.Version2016);
            System.out.println("ネストされたJSONをExcelに正常に変換しました。");
            workbook.dispose();

        } catch (Exception e) {
            System.err.println("エラー: " + e.getMessage());
        }
    }

    /**
     * JSON オブジェクトをキーと値のペアに再帰的にフラット化する。
     * ネストされたキーはドットで結合される(例:「Contact.Email」)。
     */
    private static LinkedHashMap<String, String> flattenJson(JsonNode node, String prefix) {
        LinkedHashMap<String, String> flat = new LinkedHashMap<>();
        if (node.isObject()) {
            for (Iterator<Map.Entry<String, JsonNode>> it = node.fields(); it.hasNext(); ) {
                Map.Entry<String, JsonNode> entry = it.next();
                String newPrefix = prefix.isEmpty() ? entry.getKey() : prefix + "." + entry.getKey();
                flat.putAll(flattenJson(entry.getValue(), newPrefix));
            }
        } else {
            flat.put(prefix, node.asText());
        }
        return flat;
    }
}

flattenJsonメソッドは、各 JSON オブジェクトを再帰的に走査します。ネストされたオブジェクトを検出すると、親キーをドット区切りで結合します(例:Contact.Email)。リーフ値に到達すると、ドット区切りの完全なキーとその値をマップに格納します。これにより、任意のネスト深度のすべてのフィールドが、結果の Excel シートで列として表現されます。

Convert nested JSON to a flat Excel table in Java


8. JSON ファイルを Excel に変換する

実際のアプリケーションでは、JSON データはインライン文字列ではなくディスク上のファイルから読み込まれるのが一般的です。変換手順は同じで、JSON の取得元のみが異なります。Jackson のObjectMapperFileオブジェクトから直接読み込めます。

import com.spire.xls.*;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import java.io.File;
import java.util.Iterator;
import java.util.Map;

public class JsonFileToExcel {

    public static void main(String[] args) {

        try {
            // ステップ 1:JSON ファイルを読み込んで解析する
            ObjectMapper mapper = new ObjectMapper();
            JsonNode rootNode = mapper.readTree(new File("employees.json"));

            if (!rootNode.isArray()) {
                throw new IllegalArgumentException("ルートレベルにJSON配列が必要です");
            }
            ArrayNode jsonArray = (ArrayNode) rootNode;

            // ステップ 2:ワークブックを作成する
            Workbook workbook = new Workbook();
            Worksheet sheet = workbook.getWorksheets().get(0);
            sheet.setName("社員一覧");

            // ステップ 3:最初のオブジェクトからヘッダーを書き込む
            JsonNode firstObject = jsonArray.get(0);
            int col = 1;
            for (Iterator<Map.Entry<String, JsonNode>> it = firstObject.fields(); it.hasNext(); ) {
                Map.Entry<String, JsonNode> entry = it.next();
                sheet.get(1, col).setValue(entry.getKey());
                col++;
            }

            // ステップ 4:データ行を書き込む
            for (int i = 0; i < jsonArray.size(); i++) {
                JsonNode record = jsonArray.get(i);
                int dataRow = i + 2;
                int dataCol = 1;
                for (Iterator<Map.Entry<String, JsonNode>> it = record.fields(); it.hasNext(); ) {
                    Map.Entry<String, JsonNode> entry = it.next();
                    JsonNode value = entry.getValue();
                    if (value.isNumber()) {
                        sheet.get(dataRow, dataCol).setNumberValue(value.doubleValue());
                    } else if (value.isBoolean()) {
                        sheet.get(dataRow, dataCol).setBooleanValue(value.booleanValue());
                    } else {
                        sheet.get(dataRow, dataCol).setValue(value.asText());
                    }
                    dataCol++;
                }
            }

            // ステップ 5:Excel にエクスポートする
            sheet.getAllocatedRange().autoFitColumns();
            workbook.saveToFile("EmployeesFromJson.xlsx", ExcelVersion.Version2016);
            System.out.println("JSONファイルをExcelに正常に変換しました。");
            workbook.dispose();

        } catch (Exception e) {
            System.err.println("JSONファイルの読み込み中にエラーが発生しました: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Jackson はファイルをストリーミングツリーモデルとして処理するため、この方法で大きな JSON ファイルを効率的に処理できます。非常に大きな JSON ファイル(数百メガバイト以上)の場合は、Jackson のJsonParserをストリーミングモードで使用して、全ツリーを一度にメモリに読み込むのではなく、レコードを逐次処理することを検討してください。


9. Excel の行と列を自動調整する

JSON データが Excel のセルに書き込まれると、デフォルトの列幅では内容がすべて表示されない場合があります。メールアドレス、URL、長い説明などのテキスト値は視覚的に切り詰められてしまいます。Spire.XLS では、列幅と行の高さを内容に合わせて自動調整するメソッドを提供しています。

// 使用範囲の全列と全行を自動調整する
sheet.getAllocatedRange().autoFitColumns();
sheet.getAllocatedRange().autoFitRows();

これらの行は、全データを書き込んだ後、ワークブックを保存する前に追加します。getAllocatedRange()メソッドはデータを含むセル範囲を返すため、実際にデータが入力されているセルのみが調整対象となります。

より細かな制御が必要な場合は、個別の列を自動調整することもできます。

// 特定の列を自動調整する(例:3 列目)
sheet.getAllocatedRange().getColumns()[2].autoFitColumns();

自動調整を行うことで、よりプロフェッショナルで読みやすいスプレッドシートが得られます。特に、JSON データに可変長のテキストフィールドが含まれる場合に効果的です。以下のスクリーンショットは、そのままエクスポートした場合と自動調整を適用した場合の違いを示しています。


10. エクスポートした Excel ファイルに書式を適用する

そのままエクスポートしたデータは、ビジネスレポートの基準を満たすために書式設定が必要になることがよくあります。Spire.XLS for Java は、ヘッダースタイルの設定、数値の書式設定、日付形式の適用など、セルの書式設定に関する豊富な API を提供します。

ヘッダー行の書式設定

ヘッダー行をデータと区別するために、太字テキストと背景色を適用します。

import com.spire.xls.core.spreadsheet.styles.CellStyle;
import java.awt.Color;

// ヘッダー行に書式を適用する
CellRange headerRange = sheet.getAllocatedRange().getRows()[0];
headerRange.getStyle().setFont(new ExcelFont(true));
headerRange.getStyle().setColor(Color.decode("#4472C4"));
headerRange.getStyle().getFont().setColor(Color.WHITE);
headerRange.setStyle(headerRange.getStyle());

数値の書式設定

数値列に通貨やパーセンテージの書式を適用します。

// Salary 列(4 列目)を通貨形式に設定する
CellRange salaryColumn = sheet.getAllocatedRange().getColumns()[3];
salaryColumn.setNumberFormat("¥#,##0");

日付の書式設定

JSON に日付文字列が含まれている場合、対応する列に書式を設定して一貫した形式で表示できます。

// HireDate 列(5 列目)を日付形式に設定する
CellRange dateColumn = sheet.getAllocatedRange().getColumns()[4];
dateColumn.setNumberFormat("yyyy/mm/dd");

上記の書式設定技術を組み合わせることで、プロフェッショナルな Excel レポートを作成できます。高度な Excel 書式設定機能を含む完全な Java コード例については、Spire.XLS を使用した Java での Excel ファイルの作成と書式設定をご参照ください。


11. JSON を Excel に変換する際のよくある課題

実際の JSON データは、チュートリアルの例のように整っていることは稀です。以下に、JSON を Excel に変換する際に開発者が直面する代表的な課題と、その実用的な解決策を紹介します。

オブジェクト間でのフィールドの欠落

同じ配列内の異なる JSON オブジェクト間で、フィールドが一貫しない場合があります。あるレコードにはPhoneフィールドが含まれているのに、別のレコードでは完全に欠落していることがあります。すべてのオブジェクトが同じキーを共有することを前提としたコードでは、フィールドの欠落により Excel 出力でインデックスのずれが生じます。

解決策: まずすべてのオブジェクトから一意のキーを収集し、統一されたキーリストを使用して各オブジェクトの値を書き込みます。

// 全 JSON オブジェクトから一意のキーを収集する
LinkedHashSet<String> allKeys = new LinkedHashSet<>();
for (JsonNode record : jsonArray) {
    record.fieldNames().forEachRemaining(allKeys::add);
}

// 完全なキーセットからヘッダーを書き込む
int col = 1;
for (String key : allKeys) {
    sheet.get(1, col).setValue(key);
    col++;
}

// 値を書き込む。欠落したフィールドは空文字列とする
for (int i = 0; i < jsonArray.size(); i++) {
    JsonNode record = jsonArray.get(i);
    int dataRow = i + 2;
    int dataCol = 1;
    for (String key : allKeys) {
        JsonNode value = record.get(key);
        String cellValue = (value != null && !value.isNull()) ? value.asText() : "";
        sheet.get(dataRow, dataCol).setValue(cellValue);
        dataCol++;
    }
}

ネストされたオブジェクト

JSON オブジェクトには任意の深度のネストが含まれることがあります。ネストされたオブジェクトをそのままセルに書き込むと、[object Object]やシリアライズされた JSON 文字列のような読めない出力になってしまいます。

解決策: セクション 7で示した再帰的なフラット化アプローチを使用します。flattenJsonメソッドはオブジェクトツリー全体を走査し、ネストされたキーをドット区切りで結合したフラットなキーと値のペアを生成します。

大規模な JSON ファイル

非常に大きな JSON ファイル(数百メガバイト以上)を 1 つのインメモリツリーに解析すると、Java でOutOfMemoryErrorが発生する可能性があります。さらに、数万行のデータを 1 セルずつ書き込むと処理が遅くなる場合があります。

解決策: Jackson のストリーミング API(JsonParser)を使用して、JSON レコードを 1 つずつ読み込み、各レコードを処理したらすぐに Excel に書き込みます。これにより、ファイルサイズに関わらずメモリ使用量を一定に保てます。

import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;

JsonFactory factory = new JsonFactory();
try (JsonParser parser = factory.createParser(new File("large_data.json"))) {
    int dataRow = 2;
    while (parser.nextToken() != JsonToken.END_ARRAY) {
        // 1 オブジェクトずつ解析する
        JsonNode record = mapper.readTree(parser);
        // Excel に書き込む...
        dataRow++;
    }
}

データ型の変換

JSON は文字列、数値、ブール値、null 値、配列、オブジェクトをサポートしています。Excel のセルはテキスト、数値、ブール値、日付、エラーをサポートしています。型が一致しない場合、例えば数値を文字列として保存すると、Excel の並べ替えや数式計算が正しく機能しなくなります。

解決策: セルに書き込む前に各 JSON 値の型を確認します。数値にはsetNumberValue()、ブール値にはsetBooleanValue()、テキストにはsetValue()を使用します。null値は空文字列やプレースホルダーを書き込んで処理します。日付文字列の場合は、Dateオブジェクトに解析し、setDateTimeValue()を使用して Excel の日付セルとして書き込みます。

if (value == null || value.isNull()) {
    sheet.get(dataRow, dataCol).setValue("");
} else if (value.isNumber()) {
    sheet.get(dataRow, dataCol).setNumberValue(value.doubleValue());
} else if (value.isBoolean()) {
    sheet.get(dataRow, dataCol).setBooleanValue(value.booleanValue());
} else {
    sheet.get(dataRow, dataCol).setValue(value.asText());
}

12. JSON から Excel の変換に Spire.XLS for Java を選ぶ理由

Spire.XLS for Java がエンタープライズ Java アプリケーションにおける JSON から Excel への変換に適している理由をいくつか紹介します。

Microsoft Excel 不要

Spire.XLS for Java はスタンドアロンのライブラリであり、Microsoft Office やその他の外部ソフトウェアに依存しません。Java 実行環境があれば動作するため、Office が利用できない Linux サーバー、Docker コンテナ、クラウドプラットフォームでも実行可能です。

XLS と XLSX の両方に対応

従来の XLS 形式(Excel 97~2003)と最新の XLSX 形式(Excel 2007 以降)の両方を処理できます。1 つのパラメータを変更するだけでどちらの形式にもエクスポートできるため、多様な環境に対応できます。

豊富な書式設定機能

基本的なセル値の書き込みに加え、Spire.XLS はセルスタイル、数値書式、フォント、色、罫線、条件付き書式、グラフ、ピボットテーブルなど、包括的な書式設定機能を提供します。JSON データから直接、Excel での後処理なしにプロフェッショナルな品質の Excel ファイルを生成できます。

直感的な API

API は直感的なオブジェクトモデルに従います。WorkbookWorksheetを含み、各WorksheetCellRangeを含み、各CellRangeは値の設定、スタイル設定、書式設定をサポートします。Excel のオブジェクトモデルに慣れている開発者であれば、すぐに生産性を発揮できます。

エンタープライズアプリケーションに最適

Spire.XLS for Java はサーバーサイドおよびエンタープライズ用途を想定して設計されています。大規模ファイルの効率的な処理、マルチスレッドアクセスパターンのサポート、Spring Boot、Jakarta EE などエンタープライズ環境で一般的に使用される Java フレームワークとのスムーズな統合が可能です。

30 日間の無料ライセンスを申請して、プロジェクトで全機能を評価できます。


13. まとめ

本記事では、Spire.XLS for Java と Jackson を使用してJava で JSON を Excel に変換する方法を解説しました。JSON データを解析し、Excel ワークシートに値を書き込み、ワークブックを XLSX または XLS ファイルとしてエクスポートすることで、構造化された JSON データを読みやすいスプレッドシートに効率的に変換できます。

Spire.XLS for Java は、Microsoft Office や外部依存関係を必要とせずに、JSON データから Excel ファイルを生成するシンプルかつ柔軟な方法を提供します。さらに、書式設定、自動調整、複雑なデータ構造の処理など、プロフェッショナルな Excel レポート作成のための高度な機能もサポートしています。


14. よくある質問

Java で JSON を Excel に変換するにはどうすればよいですか?

Jackson のObjectMapperを使用して JSON データを解析し、Spire.XLS for Java でWorkbookWorksheetを作成します。JSON キーを最初の行に列ヘッダーとして書き込み、JSON 配列を反復処理して各行のデータを入力します。最後に、希望するExcelVersionを指定してsaveToFile()でワークブックを保存します。完全なコード例はセクション 5に記載されています。

Microsoft Excel をインストールせずに Java で JSON を XLSX に変換できますか?

はい、可能です。Spire.XLS for Java はスタンドアロンのライブラリであり、Microsoft Office やその他のソフトウェアを必要としません。Java のみで XLSX ファイルの作成、読み込み、書き込みが可能で、Linux、Docker、クラウドプラットフォーム上で動作するサーバーサイドアプリケーションに適しています。

ネストされた JSON オブジェクトを Excel に変換する際はどのように処理すればよいですか?

JSON オブジェクトツリーを走査し、フラットなキーと値のペアを生成する再帰的なフラット化関数を使用します。ネストされたキーはドット区切りで結合されます(例:Contact.Email)。フラット化されたキーが Excel シートの列ヘッダーになります。完全な実装はセクション 7を参照してください。

Spire.XLS の setValue()と setNumberValue()の違いは何ですか?

setValue(String)はセルに文字列値を書き込み、setNumberValue(double)は Excel で数値として扱われる数値を書き込みます。数値の JSON フィールドにsetNumberValue()を使用することで、並べ替え、フィルタリング、数式計算が正しく機能します。同様に、setBooleanValue(boolean)は型付きのブール値を書き込みます。

大規模な JSON ファイルをメモリ不足にならずに Excel に変換するにはどうすればよいですか?

大規模な JSON ファイルには、Jackson のストリーミング API(JsonParser)を使用して、ファイル全体をメモリに読み込むのではなく、JSON レコードを 1 つずつ読み込んで処理します。各レコードを解析したらすぐに Excel ワークシートに書き込むことで、ファイルサイズに関わらずメモリ使用量を一定に保てます。

Spire.XLS for Java は無料ですか?

Spire.XLS for Java は商用ライブラリです。制限付きの無料版**Free Spire.XLS for Java**も提供されています。購入前に全機能を評価したい場合は、30 日間の無料ライセンスを申請できます。

Read 5 times