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
- Usar
ArrayAsTable = true
- Esto es esencial para una representación adecuada de los arreglos - Considerar crear múltiples hojas de trabajo para datos jerárquicos complejos
- Aplicar formato para hacer la salida más legible
- Usar
NestedArrayAsTable = true
cuando esté disponible para un mejor manejo de estructuras anidadas - Para estructuras extremadamente complejas, considere preprocesar el JSON antes de la importación
Problemas Comunes y Soluciones
Problema | Solución |
---|---|
Los arreglos anidados aparecen como celdas individuales | Habilitar las opciones ArrayAsTable y NestedArrayAsTable |
Se pierden las relaciones de datos | Crear múltiples tablas/hojas con columnas de relación |
Los nombres de las columnas son incorrectos | Usar la opción DateTimeGroupSeparator para personalizar la nomenclatura |
Problemas de memoria con archivos grandes | Procesar el JSON en fragmentos o usar enfoques de transmisión |