Comment aplatir un tableau JSON pour la conversion Excel avec C#
Lorsque vous travaillez avec des API modernes et des services web, les développeurs rencontrent souvent des structures JSON complexes avec des tableaux et des objets profondément imbriqués. Convertir ces structures hiérarchiques en tableaux Excel plats représente un défi considérable. Ce guide montre comment convertir efficacement des tableaux JSON imbriqués en Excel en utilisant Aspose.Cells pour .NET.
Le défi : Structures JSON imbriquées complexes
Considérez cette réponse JSON typique d’une 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"]
}
]
}
]
}
Convertir ces données hiérarchiques en un tableau Excel plat crée plusieurs défis :
- Comment gérer plusieurs tableaux imbriqués (départements, employés, compétences)
- Comment maintenir les relations entre les éléments parents et enfants
- Comment créer une structure de feuille de calcul lisible
Solution étape par étape
Étape 1 : Installer Aspose.Cells
Tout d’abord, installez Aspose.Cells pour .NET :
dotnet add package Aspose.Cells
Étape 2 : Configurer JsonLayoutOptions
Créez des JsonLayoutOptions correctement configurés pour gérer les tableaux :
using Aspose.Cells;
using Aspose.Cells.Utility;
// Créer JsonLayoutOptions avec gestion des tableaux
JsonLayoutOptions options = new JsonLayoutOptions();
options.ArrayAsTable = true; // Crucial pour un aplatissement correct
options.ConvertNumericOrDate = true;
options.IgnoreNull = true;
Étape 3 : Charger des données JSON complexes
Chargez vos données JSON imbriquées complexes :
// JSON d'exemple avec des tableaux imbriqués
string jsonData = File.ReadAllText("complex_data.json");
// Initialiser le classeur et la feuille de calcul
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];
Étape 4 : Configurer un aplatissement avancé
Pour des structures imbriquées avancées, implémentez une solution d’aplatissement personnalisée :
// Définir la position de la cellule de départ
int startRow = 0;
int startColumn = 0;
// Importer les données JSON avec nos options configurées
JsonUtility.ImportData(jsonData, worksheet.Cells, startRow, startColumn, options);
Étape 5 : Gérer les tableaux imbriqués multi-niveaux
Pour des tableaux complexes à plusieurs niveaux, nous avons besoin d’un traitement supplémentaire :
// Créer une deuxième feuille de calcul pour les données détaillées des employés
Worksheet employeeSheet = workbook.Worksheets.Add("Employees");
int empRow = 0;
// Ajouter des en-têtes pour la feuille des employés
string[] headers = { "Department", "Employee ID", "Employee Name", "Skills" };
for (int i = 0; i < headers.Length; i++)
{
employeeSheet.Cells[empRow, i].PutValue(headers[i]);
}
empRow++;
// Analyser le JSON pour extraire et aplatir les données des employés
// Remarque : Cela nécessiterait une bibliothèque de parsing JSON comme 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++;
// }
// }
Étape 6 : Appliquer un formatage professionnel
Améliorez la lisibilité avec un formatage approprié :
// Formater les deux feuilles de calcul en tant que tableaux avec en-têtes
worksheet.ListObjects.Add(0, 0, worksheet.Cells.LastCell.Row, worksheet.Cells.LastCell.Column, true);
employeeSheet.ListObjects.Add(0, 0, empRow - 1, 3, true);
// Ajuster automatiquement les colonnes pour une meilleure lisibilité
worksheet.AutoFitColumns();
employeeSheet.AutoFitColumns();
Étape 7 : Enregistrer le résultat
Exporter le classeur avec les données aplaties :
// Enregistrer en tant que fichier Excel
workbook.Save("flattened_data.xlsx");
Une solution simplifiée utilisant Aspose.Cells
Pour de nombreux scénarios, Aspose.Cells fournit une approche plus simple en utilisant sa gestion JSON intégrée :
// Initialiser le classeur
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];
// Configurer les options d'importation JSON
JsonLayoutOptions options = new JsonLayoutOptions
{
ArrayAsTable = true,
ConvertNumericOrDate = true,
IgnoreNull = true,
TitleStyle = new CellsFactory().CreateStyle(),
NestedArrayAsTable = true // Important pour les tableaux imbriqués
};
// Définir le style de titre pour une meilleure lisibilité
options.TitleStyle.Font.IsBold = true;
// Importer le JSON
JsonUtility.ImportData(jsonData, sheet.Cells, 0, 0, options);
// Enregistrer le résultat
workbook.Save("flattened_output.xlsx");
Principales idées et meilleures pratiques
- Utilisez
ArrayAsTable = true
- C’est essentiel pour une représentation correcte des tableaux - Envisagez de créer plusieurs feuilles de calcul pour des données hiérarchiques complexes
- Appliquez un formatage pour rendre la sortie plus lisible
- Utilisez
NestedArrayAsTable = true
lorsque disponible pour une meilleure gestion des structures imbriquées - Pour des structures extrêmement complexes, envisagez de prétraiter le JSON avant l’importation
Problèmes courants et solutions
Problème | Solution |
---|---|
Les tableaux imbriqués apparaissent comme des cellules uniques | Activez les options ArrayAsTable et NestedArrayAsTable |
Les relations de données sont perdues | Créez plusieurs tableaux/feuilles avec des colonnes de relation |
Les noms de colonnes sont incorrects | Utilisez l’option DateTimeGroupSeparator pour personnaliser le nommage |
Problèmes de mémoire avec de gros fichiers | Traitez le JSON par morceaux ou utilisez des approches de streaming |