JSONからExcelへ
「JSONからExcelへ」は、ブラウザ内で本物の.xlsxワークブックを書き出します。.xlsにリネームしたCSVではありません。数値は数値のまま、文字列は文字列のまま保たれ、ヘッダー行は固定されてフィルターが付き、ネストしたオブジェクトは明示的な列パスに変換されます。アップロードは一切行われません。
| id | customer.name | customer.email | total | currency | tags[0] | tags[1] | shipped | note |
|---|---|---|---|---|---|---|---|---|
| ord_1041 | Ada Lovelace | [email protected] | 148.5 | GBP | priority | gift | TRUE | — |
| ord_1042 | Grace Hopper | [email protected] | 92 | USD | standard | — | FALSE | 隣人に預ける |
JSONからExcelへはどう動きますか?
ウェブ上のほぼすべての「JSONからExcelへ」変換ツールは、.xlsという拡張子のCSVファイルを作り出します。この違いは思った以上に重要です。CSVのセルはテキストでしかありません。そこでExcelは推測します。00123を数値123として読んで先頭の0を飲み込み、望むと望まざるにかかわらず2026-10-03を日付と決めつけ、1e5を十万に変えてしまいます。Excelは親切心でそうしているのですが、ファイルには型情報がないため、止める方法がありません。
ワークブックは型を運びます。このツールはSpreadsheetML(.xlsxの中身のXMLパート)を書き出します。そのため、JSONの数値は数値セルに、JSONの文字列は文字列セルに、ブーリアンは本物のブーリアンになります。"00123"は00123のままです。ドキュメントが文字列だと言っているからです。
ネストしたオブジェクトと配列
表計算は長方形であり、JSONは木構造です。どこかで折り合いをつけるしかありません。ここでの選択は明示的なパス表記で、JSONからCSVへの変換ツールと同じものです。オブジェクトのメンバーにはcustomer.nameを、配列のインデックスにはtags[0]を使います。2つの表記は意図的に変えてあり、列名の由来が曖昧になることはありません。
列の集合は、全レコードのフィールドの和集合を、最初に現れた順に並べたものです。素朴な実装では最初のレコードのキーだけを読むため、後から現れるものをすべて失います。50件に1件しか現れない任意のメモ、時々しか効かない割引など。このツールではそうしたフィールドにも列が用意され、他の行は空セルになります。
ワークブックの中身
太字で固定されたヘッダー行により、スクロールしても列名が画面に残ります。オートフィルターにより、どの列もワンクリックで絞り込めます。列幅は各列の最も広い値から実測され、Excelの既定値のままにはなりません。アーカイブは、バッチ画像エクスポートと同じZIPライターで書き込まれます。表計算ライブラリは読み込みません。このフォーマットは2006年から変わっておらず、依存関係を追加するとこのルートのバンドルで最も大きなものになってしまうからです。
JSON入力
[
{ "id": 1, "user": { "name": "Ada" }, "tags": ["a","b"], "vip": true },
{ "id": 2, "user": { "name": "Grace" }, "tags": ["c"] }
]ワークブックのセル
A1: id B1: user.name C1: tags[0] D1: tags[1] E1: vip A2: 1 B2: Ada C2: a D2: b E2: TRUE A3: 2 B3: Grace C3: c D3: (empty) E3: (empty)
JSON入力 → ワークブックのセル
JSON入力
[
{ "id": 1, "user": { "name": "Ada" }, "tags": ["a", "b"], "vip": true },
{ "id": 2, "user": { "name": "Grace" }, "tags": ["c"], "note": "gift" }
]ワークブックのセル
id user.name tags[0] tags[1] vip note 1 Ada a b true 2 Grace c gift
JSONからExcelへが対応するオプションとエッジケースは?
| パラメータ | 型 | デフォルト | 動作とエッジケース |
|---|---|---|---|
| 出力形式 | .xlsx | SpreadsheetML | 本物のOOXMLワークブックです。型付きセル、固定ヘッダー行、オートフィルター、実測の列幅を備えます。.xlsにリネームしたCSVにはそのどれも持たせられないことが、両者の決定的な違いです。 |
| 数値 | セル型 | 数値 | JSONの数値は数値セルになるため、合計や平均ですぐに計算できます。JSON文字列として書かれた数値は文字列のまま残り、これが製品コードや電話番号、先頭の0を守ります。 |
| 配列 | explode | join | explode | Explodeはtags[0]やtags[1]といった列を生成し、全要素を保持します。Joinはスカラーの配列を、指定した区切り文字で1つのセルにまとめます。表を読む人には通常こちらが望ましいものの、情報は失われます。オブジェクトの配列は常にexplodeで処理します。結合すると構造が壊れるためです。 |
| ネストしたオブジェクト | 列パス | customer.name | オブジェクトのメンバーにはドット形式、配列のインデックスには角括弧形式を使うため、両者は区別でき、列の集合は曖昧になりません。セルに[object Object]を貼り付けるような変換ツールこそ、これが避ける失敗です。 |
| 列の集合 | 和集合 | 全レコード | いずれかのレコードに現れるすべてのフィールドを、最初に現れた順に並べます。最初のレコードからヘッダーを読むのが、エクスポートが黙ってデータを失う最もよくある原因です。 |
| ヘッダー行の固定 | 真偽値 | true | 1行目を固定し、長いエクスポートをスクロールしても列名が見えたままになります。Excelでは「ウィンドウ枠の固定」と呼ばれる機能で、読み手が設定するのではなく、シートのビューに書き込まれます。 |
| オートフィルター | 真偽値 | true | ヘッダー行にフィルターのドロップダウンを追加します。データ行が少なくとも1行必要です。ヘッダーだけにフィルターをかけても、対象となるデータがないためです。 |
| 最上位の構造 | array | object | array | レコードの配列が想定される入力です。オブジェクト1つは1行になります。唯一の配列メンバーがデータそのものになっているオブジェクト(ほとんどのAPIが返す{"data":[…]}という形)は、その配列を利用し、その旨を示します。 |
| 入力サイズ | バイト | 8 MB | すべてメインスレッドで動くため、この上限を超えるとワークブックの生成は試みずに拒否されます。サイズにかかわらず、アップロードは一切行われません。 |
よくある質問
これは本物のExcelファイルですか、それとも拡張子を変えただけのCSVですか?
本物のワークブックです。出力はOOXMLの.xlsx、つまりSpreadsheetMLパートを束ねたZIPで、型付きセル、太字で固定されたヘッダー行、オートフィルター、実測の列幅を備えています。ここが決定的な違いです。.xlsにリネームしたCSVには型情報がないため、Excelはすべてのセルを推測せざるを得ず、先頭の0や製品コード、日付に見えるものについては推測を間違えます。
先頭の0は保持されますか?
はい。JSONで文字列として入っていれば保持されます。{"sku":"00123"}はテキスト00123を書き込み、セルが文字列だと宣言しているためExcelは00123と表示します。{"sku":123}は数値123を書き込みますが、これはドキュメントが正確なだけで、ツールが何かを失ったわけではありません。CSVベースのエクスポーターへの最大の不満がまさにこれであり、このツールがワークブックを書く理由です。
ネストしたオブジェクトや配列はどうなりますか?
列パスに変換されます。{"customer":{"name":"Ada"}}はcustomer.nameという列になり、tagsはtags[0]とtags[1]になります。配列には角括弧、オブジェクトにはドットと、表記を意図的に分けているため、列名の由来が曖昧になることはありません。配列を1つのセルにまとめたい場合はJoinモードに切り替えてください。ただしこれは情報が失われる処理で、スカラーの配列にのみ適用されます。
レコードによって持っているフィールドが違う場合、足りない部分は捨てられますか?
いいえ。列の集合は全レコードのフィールドの和集合で、最初に現れた順に並びます。50件に1件しか現れないメモにも専用の列ができ、他の行は空セルになります。最初のレコードからヘッダーを読むエクスポーターは、そうしたフィールドを黙って失います。
データはどこかにアップロードされますか?
いいえ。ワークブックはブラウザ内で組み立てられ、そのままダウンロードに渡されます。DevToolsを開いてネットワークパネルを見ながら、ドキュメントを貼り付けてダウンロードを実行してみてください。リクエストは一つも飛びません。これは見た目以上に重要です。表計算に入れられるJSONは、本物のレコードをエクスポートしたものが多いからです。
どのくらいの大きさのドキュメントまで扱えますか?
JSONで8 MBです。数万レコードに相当します。それを超えると、ツールはタブを固めてしまう代わりに処理を断ります。作業がメインスレッドで行われるためです。ワークブック自体は入力に比べて小さくなります。アーカイブはXMLテキストを保持し、deflatedではなくstoredエントリで書き込まれるため、同等のCSVより少し大きくなると考えてください。