Da JSON a Excel: quattro approcci e dove ciascuno perde fedeltà
In sintesi: Strutture annidate, campi incoerenti e array di array sono i punti in cui la conversione da JSON a foglio di calcolo si rompe. Quattro approcci ordinati per tempo di risultato, ciascuno con i suoi compromessi.

In sintesi: un array piatto di oggetti o un oggetto che racchiude un array si converte più rapidamente con lo strumento online; usa Power Query quando i dati si aggiornano ogni settimana, pandas quando ci sono molti campi da pulire e uno script Node solo quando la conversione deve entrare in una pipeline — ma decidi cosa significa "una riga" prima di toccare dati annidati o chiavi incoerenti.
La conversione in sé non è difficile; ciò che è difficile è scoprire dopo che i numeri sono diventati testo e che diversi livelli di annidamento sono collassati in uno. Leggi la struttura dei dati prima di scegliere un metodo e ti risparmi un rifacimento.
1. Prima stabilisci che tipo di JSON hai
Apri il file e guarda il livello più esterno:
| Struttura | Forma | Difficoltà di conversione |
|---|---|---|
| Array piatto di oggetti | [{"a":1,"b":2},{...}] |
La più facile — una riga per record |
| Oggetto che racchiude un array | {"data":[{...}],"total":100} |
Facile — prendi il livello data |
| Oggetti annidati | {"user":{"name":"x"}} |
Media — decidi se appiattire o unire in una stringa |
| Array di array | {"tags":["a","b"]} |
Dolorosa — non entra in una riga, serve la separazione in tabelle |
| Chiavi incoerenti | Ogni record ha campi diversi | Dolorosa — le colonne finiscono per lo più vuote |
Le prime due si convertono direttamente con un tasso di successo vicino al 100%; per le ultime tre, decidi prima cosa significa "una riga", altrimenti il foglio risultante è inutilizzabile.
2. Approccio 1: strumento online (1 minuto)
Apri Da JSON a tabella, incolla i dati → scegli delimitatore e intestazione → esporta CSV → apri in Excel. Adatto da qualche decina a qualche migliaio di righe di dati ben strutturati.
Tre cose a cui devi fare attenzione:
- Ottieni CSV, non xlsx. Quando Excel apre un CSV indovina la codifica dalla locale di sistema, quindi il testo cinese può diventare mojibake. Usare "Dati → Da testo/CSV" e selezionare esplicitamente UTF-8 è più affidabile.
- Gli identificatori che iniziano con
0perdono gli zeri."007"è testo nel CSV, ma Excel lo converte automaticamente nel numero 7. Imposta quella colonna come testo durante l'importazione, oppure aggiungi un prefisso in JSON. - I numeri lunghi diventano notazione scientifica. Documenti di identità e numeri d'ordine più lunghi di 15 cifre perdono precisione; tali campi dovrebbero già essere stringhe in JSON e devono restare in formato testo dopo l'importazione.
3. Approccio 2: Power Query integrato in Excel (riutilizzabile)
Quando i tuoi dati si aggiornano ogni settimana, usa Power Query integrato in Excel: configuralo una volta, poi basta fare clic su "Aggiorna":
- "Dati" → "Ottieni dati" → "Da file" → "Da JSON";
- Dopo aver selezionato il file arrivi nell'editor di Power Query, dove vedi strutture
List/Record; - Fai clic sull'icona di espansione a destra dell'intestazione di una colonna per espandere i campi annidati livello per livello;
- Quando i nomi e i tipi delle colonne sono corretti, "Chiudi e carica".
Il vantaggio è che l'annidamento può essere espanso in più colonne strato per strato e i tipi possono essere assegnati manualmente; il prezzo è che la prima configurazione richiede di capire la differenza tra List e Record — List è un array, Record è un oggetto, e si espandono in direzioni diverse.
4. Approccio 3: Python + pandas (molti campi, necessità di pulizia)
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)
Il parametro chiave di json_normalize è sep, che determina lo stile di denominazione delle colonne dopo l'espansione dei campi annidati; user_name è più facile da usare in Excel rispetto a user.name. Gli array di array (come tags) richiedono un ulteriore passaggio explode:
frame = frame.explode('tags')
Questo passaggio divide una riga in diverse, l'unico modo per preservare una relazione uno-a-molti — al costo di duplicare i campi rimanenti.
5. Approccio 4: uno script Node (quando deve entrare in una pipeline)
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');
Due dettagli da non saltare: scrivi \uFEFF (un BOM) all'inizio perché Excel riconosca UTF-8, e sottoponi a escape le virgolette doppie dentro le celle come "", altrimenti le colonne si spostano.
6. Tre cose che la conversione perde sempre
| Elemento perso | Sintomo | Rimedio |
|---|---|---|
| Informazioni di tipo | Numeri e booleani diventano testo o TRUE/FALSE |
Imposta manualmente i tipi delle colonne dopo l'importazione, oppure specificali in Power Query |
| Livelli di annidamento | I campi profondi collassano in [object Object] |
Usa json_normalize o espandi livello per livello — mai String(obj) |
| Relazioni uno-a-molti | Gli array vengono stipati in una singola cella | Dividi le righe con explode, oppure costruisci una tabella correlata separata |
Inoltre, null e "campo assente" nel foglio hanno lo stesso aspetto (entrambi sono celle vuote) ma significano cose diverse nel dominio di business. Quando devi distinguerli, converti esplicitamente null nella stringa "null" in JSON, oppure aggiungi una colonna marcatore _has_field.
7. Verifica successiva: non guardare solo la prima riga
Dopo la conversione, controlla a campione almeno tre cose:
- Numero di record: il numero di righe CSV dovrebbe essere uguale alla lunghezza dell'array + 1 (l'intestazione); una riga mancante di solito significa che il ritorno a capo finale è stato inghiottito;
- La colonna con il più alto tasso di null: molte celle vuote indicano nomi di chiave incoerenti — torna indietro e controlla se il JSON originale usa due grafie (
userIdeuser_id); - La riga più lunga: gli array annidati di solito finiscono lì; conferma che nulla sia stato troncato.
Quando ti serve l'operazione inversa (da Excel/CSV a JSON), usa Da CSV a JSON, e ricorda che l'intestazione viene trattata come nomi delle chiavi — cambiare l'intestazione significa cambiare i nomi dei campi.
FAQ
Come scelgo tra lo strumento online, Power Query e pandas?
Usa lo strumento online per qualche decina o qualche migliaio di righe di dati ben strutturati che converti una sola volta. Usa Power Query quando i dati si aggiornano ogni settimana, dato che si configura una volta e si aggiorna con un clic. Usa pandas con json_normalize quando ci sono molti campi da pulire, e uno script Node quando la conversione deve entrare in una pipeline.
Perché il testo cinese diventa mojibake in un CSV?
L'esportazione è CSV, non xlsx, e Excel indovina la codifica dalla locale di sistema, quindi UTF-8 senza BOM mostra mojibake. Scrivi un BOM \uFEFF all'inizio del file, oppure aprilo tramite "Dati → Da testo/CSV" e seleziona esplicitamente UTF-8.
Gli oggetti annidati devono essere appiattiti o separati in righe aggiuntive?
Appiattiscili livello per livello invece di incollarli come stringhe: Power Query espande i campi annidati in colonne, e json_normalize con sep fa lo stesso in pandas. Gli array di array richiedono un passaggio explode aggiuntivo che divide una riga in diverse. Passare un oggetto profondo a String(obj) produce solo [object Object].