Comment aplatir un tableau JSON pour la conversion Excel avec C#

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

  1. Utilisez ArrayAsTable = true - C’est essentiel pour une représentation correcte des tableaux
  2. Envisagez de créer plusieurs feuilles de calcul pour des données hiérarchiques complexes
  3. Appliquez un formatage pour rendre la sortie plus lisible
  4. Utilisez NestedArrayAsTable = true lorsque disponible pour une meilleure gestion des structures imbriquées
  5. Pour des structures extrêmement complexes, envisagez de prétraiter le JSON avant l’importation

Problèmes courants et solutions

ProblèmeSolution
Les tableaux imbriqués apparaissent comme des cellules uniquesActivez les options ArrayAsTable et NestedArrayAsTable
Les relations de données sont perduesCréez plusieurs tableaux/feuilles avec des colonnes de relation
Les noms de colonnes sont incorrectsUtilisez l’option DateTimeGroupSeparator pour personnaliser le nommage
Problèmes de mémoire avec de gros fichiersTraitez le JSON par morceaux ou utilisez des approches de streaming
 Français