Come appiattire un array JSON per la conversione in Excel con C#
Quando si lavora con API moderne e servizi web, gli sviluppatori si trovano frequentemente di fronte a strutture JSON complesse con array e oggetti annidati in profondità. Convertire queste strutture gerarchiche in tabelle Excel piatte rappresenta una sfida significativa. Questa guida dimostra come convertire efficacemente gli array JSON annidati in Excel utilizzando Aspose.Cells for .NET.
La Sfida: Strutture JSON Annidate Complesse
Considera questa tipica risposta JSON da un’API web:
{
"company": "Acme Corp",
"departments": [
{
"name": "Engineering",
"employees": [
{
"id": 101,
"name": "John Smith",
"skills": ["C#", "ASP.NET", "Azure"]
},
{
"id": 102,
"name": "Jane Doe",
"skills": ["JavaScript", "React", "Node.js"]
}
]
},
{
"name": "Marketing",
"employees": [
{
"id": 201,
"name": "Michael Johnson",
"skills": ["Content Strategy", "SEO", "Analytics"]
}
]
}
]
}
Convertire questi dati gerarchici in una tabella Excel piatta crea diverse sfide:
- Come gestire più array annidati (dipartimenti, dipendenti, competenze)
- Come mantenere le relazioni tra elementi genitori e figli
- Come creare una struttura di foglio di calcolo leggibile
Soluzione Passo-Passo
Passo 1: Installa Aspose.Cells
Per prima cosa, installa Aspose.Cells per .NET:
dotnet add package Aspose.Cells
Passo 2: Configura JsonLayoutOptions
Crea JsonLayoutOptions configurati correttamente per gestire gli array:
using Aspose.Cells;
using Aspose.Cells.Utility;
// Crea JsonLayoutOptions con gestione degli array
JsonLayoutOptions options = new JsonLayoutOptions();
options.ArrayAsTable = true; // Cruciale per una corretta appiattitura
options.ConvertNumericOrDate = true;
options.IgnoreNull = true;
Passo 3: Carica Dati JSON Complessi
Carica i tuoi dati JSON complessi e annidati:
// JSON di esempio con array annidati
string jsonData = File.ReadAllText("complex_data.json");
// Inizializza workbook e worksheet
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];
Passo 4: Configura Appiattimento Avanzato
Per strutture annidate avanzate, implementa una soluzione di appiattimento personalizzata:
// Definisci la posizione della cella di partenza
int startRow = 0;
int startColumn = 0;
// Importa i dati JSON con le nostre opzioni configurate
JsonUtility.ImportData(jsonData, worksheet.Cells, startRow, startColumn, options);
Passo 5: Gestisci Array Annidati a Più Livelli
Per array complessi a più livelli, è necessaria un’elaborazione aggiuntiva:
// Crea un secondo foglio di lavoro per i dati dettagliati dei dipendenti
Worksheet employeeSheet = workbook.Worksheets.Add("Employees");
int empRow = 0;
// Aggiungi intestazioni per il foglio dei dipendenti
string[] headers = { "Department", "Employee ID", "Employee Name", "Skills" };
for (int i = 0; i < headers.Length; i++)
{
employeeSheet.Cells[empRow, i].PutValue(headers[i]);
}
empRow++;
// Analizza JSON per estrarre e appiattire i dati dei dipendenti
// Nota: Questo richiederebbe una libreria di parsing JSON come Newtonsoft.Json
// JObject root = JObject.Parse(jsonData);
// foreach (var dept in root["departments"])
// {
// string deptName = dept["name"].ToString();
// foreach (var emp in dept["employees"])
// {
// employeeSheet.Cells[empRow, 0].PutValue(deptName);
// employeeSheet.Cells[empRow, 1].PutValue((int)emp["id"]);
// employeeSheet.Cells[empRow, 2].PutValue(emp["name"].ToString());
// employeeSheet.Cells[empRow, 3].PutValue(string.Join(", ", emp["skills"].ToObject<string[]>()));
// empRow++;
// }
// }
Passo 6: Applica Formattazione Professionale
Migliora la leggibilità con una formattazione adeguata:
// Format both worksheets as tables with headers
worksheet.ListObjects.Add(0, 0, worksheet.Cells.LastCell.Row, worksheet.Cells.LastCell.Column, true);
employeeSheet.ListObjects.Add(0, 0, empRow - 1, 3, true);
// Auto-fit columns for better readability
worksheet.AutoFitColumns();
employeeSheet.AutoFitColumns();
Passo 7: Salva il Risultato
Esporta il workbook con i dati appiattiti:
// Salva come file Excel
workbook.Save("flattened_data.xlsx");
Una Soluzione Semplificata Utilizzando Aspose.Cells
Per molti scenari, Aspose.Cells offre un approccio più semplice utilizzando la sua gestione JSON integrata:
// Inizializza workbook
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];
// Configura le opzioni di importazione JSON
JsonLayoutOptions options = new JsonLayoutOptions
{
ArrayAsTable = true,
ConvertNumericOrDate = true,
IgnoreNull = true,
TitleStyle = new CellsFactory().CreateStyle(),
NestedArrayAsTable = true // Importante per gli array annidati
};
// Imposta lo stile del titolo per una migliore leggibilità
options.TitleStyle.Font.IsBold = true;
// Importa JSON
JsonUtility.ImportData(jsonData, sheet.Cells, 0, 0, options);
// Salva il risultato
workbook.Save("flattened_output.xlsx");
Approfondimenti Chiave e Migliori Pratiche
- Utilizza
ArrayAsTable = true
- Questo è essenziale per la corretta rappresentazione degli array - Considera di creare più fogli di lavoro per dati gerarchici complessi
- Applica formattazione per rendere l’output più leggibile
- Utilizza
NestedArrayAsTable = true
quando disponibile per una migliore gestione delle strutture annidate - Per strutture estremamente complesse, considera di pre-elaborare il JSON prima dell’importazione
Problemi Comuni e Soluzioni
Problema | Soluzione |
---|---|
Gli array annidati appaiono come celle singole | Abilita le opzioni ArrayAsTable e NestedArrayAsTable |
Le relazioni tra i dati vengono perse | Crea più tabelle/fogli con colonne di relazione |
I nomi delle colonne sono errati | Usa l’opzione DateTimeGroupSeparator per personalizzare la denominazione |
Problemi di memoria con file di grandi dimensioni | Elabora il JSON a blocchi o utilizza approcci di streaming |