Como Achatar um Array JSON para Conversão em Excel com C#
Ao trabalhar com APIs modernos e serviços da web, os desenvolvedores frequentemente encontram estruturas JSON complexas com raízes e objetos profundamente nested. Converter essas estruturas hierárquicas em tabelas de Excel plana apresenta um desafio significativo. Este guia mostra como converter eficazmente raízes JSON nested para Excel usando Aspose.Cells para .NET.
O desafio: estruturas JSON complexas
Considere esta resposta JSON típica de uma 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"]
}
]
}
]
}
Converter esses dados hierárquicos em uma tabela plana do Excel cria vários desafios:
- Como lidar com múltiplos arredores (departamentos, funcionários, habilidades)
- Como manter relações entre pais e crianças
- Como criar uma estrutura de spreadsheet leitura
Solução passo a passo
Passo 1: Instalar Aspose.Cells
Primeiro, instale Aspose.Cells para .NET:
dotnet add package Aspose.Cells
Passo 2: Configurar JsonLayoutOptions
Crie opções JsonLayout corretamente configuradas para lidar com arredores:
using Aspose.Cells;
using Aspose.Cells.Utility;
// Create JsonLayoutOptions with array handling
JsonLayoutOptions options = new JsonLayoutOptions();
options.ArrayAsTable = true; // Crucial for proper flattening
options.ConvertNumericOrDate = true;
options.IgnoreNull = true;
Passo 3: Carregar os dados JSON Complex
Carregue seus dados JSON complexos:
// Sample JSON with nested arrays
string jsonData = File.ReadAllText("complex_data.json");
// Initialize workbook and worksheet
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];
Passo 4: Configuração Avançada Flattening
Para estruturas avançadas, implementar uma solução de flatulência personalizada:
// Define starting cell position
int startRow = 0;
int startColumn = 0;
// Import the JSON data with our configured options
JsonUtility.ImportData(jsonData, worksheet.Cells, startRow, startColumn, options);
Passo 5: Gerenciar Arrays Nested multi-nivel
Para arras complexas de vários níveis, precisamos de processamento adicional:
// Create a second worksheet for detailed employee data
Worksheet employeeSheet = workbook.Worksheets.Add("Employees");
int empRow = 0;
// Add headers for the employee sheet
string[] headers = { "Department", "Employee ID", "Employee Name", "Skills" };
for (int i = 0; i < headers.Length; i++)
{
employeeSheet.Cells[empRow, i].PutValue(headers[i]);
}
empRow++;
// Parse JSON to extract and flatten employee data
// Note: This would require a JSON parsing library like 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: Aplique Formatação Profissional
Melhorar a leitura com o formato adequado:
// 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: Salve o resultado
Exportar o livro de trabalho com dados flatulentes:
// Save as Excel file
workbook.Save("flattened_data.xlsx");
Uma solução simplificada usando Aspose.Cells
Para muitos cenários, Aspose.Cells fornece uma abordagem mais simples usando seu processamento JSON integrado:
// Initialize workbook
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];
// Configure JSON import options
JsonLayoutOptions options = new JsonLayoutOptions
{
ArrayAsTable = true,
ConvertNumericOrDate = true,
IgnoreNull = true,
TitleStyle = new CellsFactory().CreateStyle(),
NestedArrayAsTable = true // Important for nested arrays
};
// Set title style for better readability
options.TitleStyle.Font.IsBold = true;
// Import JSON
JsonUtility.ImportData(jsonData, sheet.Cells, 0, 0, options);
// Save result
workbook.Save("flattened_output.xlsx");
Insights e Melhores Práticas
- Use ArrayAsTable = true - Isso é essencial para a representação correta dos array
- Considerando a criação de várias folhas de trabalho para dados hierárquicos complexos
- Aplique formatação para tornar a saída mais leitura
- Utilizar a tabela = verdadeira quando disponível para melhor manuseio de estruturas nestadas
- Para estruturas extremamente complexas, considere pre-processar o JSON antes da importação
Problemas Comuns e Soluções
Questão | Solução |
---|---|
As raízes nascidas aparecem como células únicas | Permite ArrayAsTable e NestedArrayAsTable Opções |
As relações de dados estão perdidas | Crie várias tabelas/sets com colunas de relacionamento |
Nomes de colunas são incorretos | Use o DateTimeGroupSeparator A opção de personalizar o nome |
Problemas de memória com arquivos grandes | Processar o JSON em pedaços ou usar abordagens de streaming |