Cómo aplanar un array JSON para la conversión a Excel con C#

Cómo aplanar un array JSON para la conversión a Excel con C#

Cuando se trabaja con APIs modernas y servicios web, los desarrolladores a menudo se encuentran con estructuras JSON complejas que contienen arreglos y objetos anidados. Convertir estas estructuras jerárquicas en tablas de Excel planas presenta un desafío significativo. Esta guía demuestra cómo convertir eficazmente arreglos JSON anidados a Excel utilizando Aspose.Cells para .NET.

El Desafío: Estructuras JSON Complejas y Anidadas

Considere esta respuesta JSON típica de una 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 estos datos jerárquicos en una tabla de Excel plana crea varios desafíos:

  • Cómo manejar múltiples arreglos anidados (departamentos, empleados, habilidades)
  • Cómo mantener las relaciones entre los elementos padre e hijo
  • Cómo crear una estructura de hoja de cálculo legible

Solución Paso a Paso

Paso 1: Instalar Aspose.Cells

Primero, instale Aspose.Cells para .NET:

dotnet add package Aspose.Cells

Paso 2: Configurar JsonLayoutOptions

Cree JsonLayoutOptions configurados correctamente para manejar arreglos:

using Aspose.Cells;
using Aspose.Cells.Utility;

// Crear JsonLayoutOptions con manejo de arreglos
JsonLayoutOptions options = new JsonLayoutOptions();
options.ArrayAsTable = true;  // Crucial para una correcta aplanación
options.ConvertNumericOrDate = true;
options.IgnoreNull = true;

Paso 3: Cargar Datos JSON Complejos

Cargue sus datos JSON complejos anidados:

// JSON de muestra con arreglos anidados
string jsonData = File.ReadAllText("complex_data.json");

// Inicializar libro de trabajo y hoja de trabajo
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];

Paso 4: Configurar Aplanación Avanzada

Para estructuras anidadas avanzadas, implemente una solución de aplanación personalizada:

// Definir posición de celda inicial
int startRow = 0;
int startColumn = 0;

// Importar los datos JSON con nuestras opciones configuradas
JsonUtility.ImportData(jsonData, worksheet.Cells, startRow, startColumn, options);

Paso 5: Manejar Arreglos Anidados de Múltiples Niveles

Para arreglos complejos de múltiples niveles, necesitamos procesamiento adicional:

// Crear una segunda hoja de trabajo para datos detallados de empleados
Worksheet employeeSheet = workbook.Worksheets.Add("Employees");
int empRow = 0;

// Agregar encabezados para la hoja de empleados
string[] headers = { "Department", "Employee ID", "Employee Name", "Skills" };
for (int i = 0; i < headers.Length; i++)
{
    employeeSheet.Cells[empRow, i].PutValue(headers[i]);
}
empRow++;

// Analizar JSON para extraer y aplanar datos de empleados
// Nota: Esto requeriría una biblioteca de análisis JSON como 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++;
//     }
// }

Paso 6: Aplicar Formato Profesional

Mejore la legibilidad con un formato adecuado:

// Formatear ambas hojas de trabajo como tablas con encabezados
worksheet.ListObjects.Add(0, 0, worksheet.Cells.LastCell.Row, worksheet.Cells.LastCell.Column, true);
employeeSheet.ListObjects.Add(0, 0, empRow - 1, 3, true);

// Ajustar automáticamente las columnas para una mejor legibilidad
worksheet.AutoFitColumns();
employeeSheet.AutoFitColumns();

Paso 7: Guardar el Resultado

Exportar el libro de trabajo con datos aplanados:

// Guardar como archivo de Excel
workbook.Save("flattened_data.xlsx");

Una Solución Simplificada Usando Aspose.Cells

Para muchos escenarios, Aspose.Cells proporciona un enfoque más simple utilizando su manejo de JSON incorporado:

// Inicializar libro de trabajo
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];

// Configurar opciones de importación JSON
JsonLayoutOptions options = new JsonLayoutOptions
{
    ArrayAsTable = true,
    ConvertNumericOrDate = true,
    IgnoreNull = true,
    TitleStyle = new CellsFactory().CreateStyle(),
    NestedArrayAsTable = true  // Importante para arreglos anidados
};

// Establecer estilo de título para mejor legibilidad
options.TitleStyle.Font.IsBold = true;

// Importar JSON
JsonUtility.ImportData(jsonData, sheet.Cells, 0, 0, options);

// Guardar resultado
workbook.Save("flattened_output.xlsx");

Perspectivas Clave y Mejores Prácticas

  1. Usar ArrayAsTable = true - Esto es esencial para una representación adecuada de los arreglos
  2. Considerar crear múltiples hojas de trabajo para datos jerárquicos complejos
  3. Aplicar formato para hacer la salida más legible
  4. Usar NestedArrayAsTable = true cuando esté disponible para un mejor manejo de estructuras anidadas
  5. Para estructuras extremadamente complejas, considere preprocesar el JSON antes de la importación

Problemas Comunes y Soluciones

ProblemaSolución
Los arreglos anidados aparecen como celdas individualesHabilitar las opciones ArrayAsTable y NestedArrayAsTable
Se pierden las relaciones de datosCrear múltiples tablas/hojas con columnas de relación
Los nombres de las columnas son incorrectosUsar la opción DateTimeGroupSeparator para personalizar la nomenclatura
Problemas de memoria con archivos grandesProcesar el JSON en fragmentos o usar enfoques de transmisión
 Español