JSON do Excel: cztery podejścia i gdzie każde traci wierność
Podsumowanie: Zagnieżdżone struktury, niespójne pola i tablice tablic to miejsca, w których konwersja JSON-a do arkusza się łamie. Cztery podejścia uporządkowane według czasu do wyniku, każde z kompromisami.

Najważniejsze: płaska tablica obiektów albo obiekt opakowujący tablicę konwertują się najszybciej przez narzędzie online; użyj Power Query, gdy dane odświeżają się co tydzień, pandas gdy jest wiele pól do oczyszczenia, a skryptu Node tylko gdy konwersja musi wejść do potoku — ale przed dotknięciem zagnieżdżonych danych lub niespójnych kluczy zdecyduj, co znaczy „jeden wiersz”.
Sama konwersja nie jest trudna; trudne jest odkrycie po fakcie, że liczby stały się tekstem, a kilka poziomów zagnieżdżenia zapadło się w jeden. Przeczytaj strukturę danych przed wyborem metody, a zaoszczędzisz sobie poprawki.
1. Najpierw ustal, jakiego rodzaju JSON masz
Otwórz plik i spójrz na poziom zewnętrzny:
| Struktura | Kształt | Trudność konwersji |
|---|---|---|
| Płaska tablica obiektów | [{"a":1,"b":2},{...}] |
Najłatwiej — jeden wiersz per rekord |
| Obiekt opakowujący tablicę | {"data":[{...}],"total":100} |
Łatwo — weź poziom data |
| Zagnieżdżone obiekty | {"user":{"name":"x"}} |
Średnio — zdecyduj, czy spłaszczać, czy sklejać w łańcuch |
| Tablice tablic | {"tags":["a","b"]} |
Boleśnie — nie mieszczą się w jednym wierszu, wymagają podziału tabeli |
| Niespójne klucze | Każdy rekord ma inne pola | Boleśnie — kolumny kończą się w większości puste |
Dwie pierwsze konwertują się bezpośrednio z niemal 100% skutecznością; przy trzech ostatnich najpierw zdecyduj, co znaczy „jeden wiersz”, inaczej wynikowy arkusz jest bezużyteczny.
2. Podejście 1: narzędzie online (1 minuta)
Otwórz JSON do tabeli, wklej dane → wybierz separator i nagłówek → wyeksportuj CSV → otwórz w Excelu. Pasuje do od kilkudziesięciu do kilku tysięcy wierszy dobrze ustrukturyzowanych danych.
Trzy rzeczy, na które musisz uważać:
- Otrzymujesz CSV, a nie xlsx. Gdy Excel otwiera CSV, zgaduje kodowanie z ustawień regionalnych systemu, więc chiński tekst może stać się krzaczkami. Użycie „Dane → Z tekstu/CSV” i jawne wybranie UTF-8 jest bardziej niezawodne.
- Identyfikatory zaczynające się od
0tracą zera."007"w CSV jest tekstem, ale Excel automatycznie konwertuje je do liczby 7. Ustaw tę kolumnę jako tekst podczas importu albo dodaj prefiks w JSON-ie. - Długie liczby stają się notacją naukową. Numery dowodów i numery zamówień dłuższe niż 15 cyfr tracą precyzję; takie pola powinny już być łańcuchami w JSON-ie i po imporcie muszą pozostać w formacie tekstowym.
3. Podejście 2: wbudowany Power Query w Excelu (wielokrotnego użytku)
Gdy dane odświeżają się co tydzień, użyj Power Query wbudowanego w Excel: skonfiguruj raz, a potem klikaj tylko „Odśwież”:
- „Dane” → „Pobierz dane” → „Z pliku” → „Z JSON”;
- Po wybraniu pliku trafiasz do edytora Power Query, gdzie widzisz struktury
List/Record; - Kliknij ikonę rozwijania po prawej stronie nagłówka kolumny, aby rozwijać zagnieżdżone pola poziom po poziomie;
- Gdy nazwy kolumn i typy wyglądają dobrze, wybierz „Zamknij i załaduj”.
Zaletą jest to, że zagnieżdżenie można rozwijać do wielu kolumn warstwa po warstwie, a typy można przypisywać ręcznie; ceną jest to, że pierwsza konfiguracja wymaga zrozumienia różnicy między List a Record — List to tablica, Record to obiekt, a rozwijają się w różnych kierunkach.
4. Podejście 3: Python + pandas (wiele pól, wymaga czyszczenia)
import pandas as pd
# Object wrapping an array: first reach the list level
rows = pd.read_json('data.json')['data']
# Expand nested fields into multiple columns
frame = pd.json_normalize(rows, sep='_')
frame.to_excel('out.xlsx', index=False)
Kluczowym parametrem json_normalize jest sep, który określa styl nazewnictwa kolumn po rozwinięciu zagnieżdżonych pól; user_name jest łatwiejsze w użyciu w Excelu niż user.name. Tablice tablic (takie jak tags) wymagają dodatkowego etapu explode:
frame = frame.explode('tags')
Ten etap dzieli jeden wiersz na kilka, co jest jedynym sposobem zachowania relacji jeden-do-wielu — kosztem duplikowania pozostałych pól.
5. Podejście 4: skrypt Node (gdy musi wejść do potoku)
import { readFileSync, writeFileSync } from 'node:fs';
const rows = JSON.parse(readFileSync('data.json', 'utf8'));
const headers = [...new Set(rows.flatMap((row) => Object.keys(row)))];
const escapeCell = (value) => `"${String(value ?? '').replaceAll('"', '""')}"`;
const lines = [
headers.join(','),
...rows.map((row) => headers.map((key) => escapeCell(row[key])).join(',')),
];
writeFileSync('out.csv', '\uFEFF' + lines.join('\n'), 'utf8');
Dwa szczegóły, których nie powinieneś pomijać: zapisz \uFEFF (BOM) na początku, aby Excel rozpoznał UTF-8, i escape'uj podwójne cudzysłowy w komórkach jako "", inaczej kolumny się przesuną.
6. Trzy rzeczy, które konwersja zawsze gubi
| Utracony element | Objaw | Środek zaradczy |
|---|---|---|
| Informacja o typie | Liczby i wartości logiczne stają się tekstem lub TRUE/FALSE |
Ustaw typy kolumn ręcznie po imporcie albo określ je w Power Query |
| Poziomy zagnieżdżenia | Głębokie pola zapadają się w [object Object] |
Użyj json_normalize albo rozwijaj poziom po poziomie — nigdy String(obj) |
| Relacje jeden-do-wielu | Tablice zostają wepchnięte do jednej komórki | Podziel wiersze przez explode albo zbuduj osobną powiązaną tabelę |
Ponadto null i „brak pola” wyglądają w arkuszu tak samo (oba to puste komórki), ale w domenie biznesowej znaczą co innego. Gdy musisz je rozróżnić, jawnie zamień null na łańcuch "null" w JSON-ie albo dodaj kolumnę znacznika _has_field.
7. Weryfikacja po fakcie: nie patrz tylko na pierwszy wiersz
Po konwersji sprawdź wyrywkowo co najmniej trzy rzeczy:
- Liczba rekordów: liczba wierszy CSV powinna równać się długości tablicy + 1 (nagłówek); brakujący wiersz zwykle oznacza, że końcowa nowa linia została pochłonięta;
- Kolumna o najwyższym współczynniku null: wiele pustych komórek wskazuje na niespójne nazwy kluczy — wróć i sprawdź, czy oryginalny JSON używa dwóch pisowni (
userIdiuser_id); - Najdłuższy wiersz: zagnieżdżone tablice zwykle tam trafiają; potwierdź, że nic nie zostało obcięte.
Gdy potrzebujesz operacji odwrotnej (Excel/CSV z powrotem do JSON), użyj CSV do JSON i pamiętaj, że nagłówek jest traktowany jako nazwy kluczy — zmiana nagłówka to zmiana nazw pól.
FAQ
Jak wybrać między narzędziem online, Power Query i pandas?
Użyj narzędzia online dla od kilkudziesięciu do kilku tysięcy wierszy dobrze ustrukturyzowanych danych, które konwertujesz raz. Użyj Power Query, gdy dane odświeżają się co tydzień, ponieważ konfiguruje się je raz i odświeża jednym kliknięciem. Użyj pandas z json_normalize, gdy jest wiele pól do oczyszczenia, a skryptu Node, gdy konwersja musi wejść do potoku.
Dlaczego chiński tekst zamienia się w krzaczki w CSV?
Eksport to CSV, a nie xlsx, a Excel zgaduje kodowanie z ustawień regionalnych systemu, więc UTF-8 bez BOM pokazuje krzaczki. Zapisz BOM \uFEFF na początku pliku albo otwórz go przez „Dane → Z tekstu/CSV” i jawnie wybierz UTF-8.
Czy zagnieżdżone obiekty spłaszczać, czy dzielić na dodatkowe wiersze?
Spłaszczaj je poziom po poziomie, zamiast wklejać jako łańcuchy: Power Query rozwija zagnieżdżone pola do kolumn, a json_normalize z sep robi to samo w pandas. Tablice tablic wymagają dodatkowego etapu explode, który dzieli jeden wiersz na kilka. Przekazanie głębokiego obiektu do String(obj) daje tylko [object Object].