Как преобразовать JSON-массив в плоский формат для конверсии в Excel с помощью C#
При работе с современными АПИ и веб-сервисами, разработчики часто встречаются с сложными структурами JSON с глубоко гнездовыми рамками и объектами. Конвертирование этих иерархических структур в плоские таблицы Excel представляет собой значительный вызов. Это руководство демонстрирует, как эффективно конвертировать гнездовые рамки JSON в Excel с помощью Aspose.Cells для .NET.
Оригинальное название: Complex Nested JSON Structures
Рассмотрим этот типичный JSON ответ из веб-API:
{
"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"]
}
]
}
]
}
Конвертирование этих иерархических данных в плоскую таблицу Excel создает несколько проблем:
- Как справляться с множественными гнездами (департаментами, сотрудниками, навыками)
- Как поддерживать отношения между родителями и предметами ребенка
- Как создать читаемую структуру шины
Step-by-step решение
Шаг 1: Установка Aspose.Cells
Сначала установите Aspose.Cells для .NET:
dotnet add package Aspose.Cells
Шаг 2: Настройка JsonLayoutOptions
Создайте правильно конфигурированные JsonLayoutOptions, чтобы справляться с расчетами:
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;
Шаг 3: Загрузка комплекса JSON данных
Загрузите свои сложные нестонные JSON данные:
// 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];
Шаг 4: Настройка Advanced Flattening
Для передовых нестных конструкций реализуется персонализированный флатенционный раствор:
// 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);
Шаг 5: Сделайте многоуровневые нержавеющие плиты
Для сложных многоуровневых уплотнениях требуется дополнительная обработка:
// 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++;
// }
// }
Шаг 6: Применение профессионального форматирования
Улучшить читаемость с правильным форматированием:
// 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();
Шаг 7: Сохранить результат
Экспортируйте рабочую книгу с флатентными данными:
// Save as Excel file
workbook.Save("flattened_data.xlsx");
Упрощенное решение с помощью Aspose.Cells
Для многих сценариев Aspose.Cells предлагает более простой подход с использованием встроенного JSON-управления:
// 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");
Ключевые идеи и лучшие практики
- Use ArrayAsTable = true - Это необходимо для правильного представления расей
- Создание множественных рабочих столов для сложных иерархических данных
- Применяйте форматирование, чтобы сделать вывод более читаемым
- Употребление NestedArrayAsTable = true при наличии для лучшего обращения с гнездовыми структурами
- Для чрезвычайно сложных конструкций рассмотрите предварительную обработку JSON перед импортом
Общие проблемы и решения
Проблема | Решение |
---|---|
Нестные расы появляются как одиночные клетки | Возможность ArrayAsTable и NestedArrayAsTable Опции |
Данные связи теряются | Создание нескольких таблиц/сетей с колоннами взаимоотношений |
Имена колонны неверны | Используйте DateTimeGroupSeparator Возможность персонализировать фамилия |
Проблемы памяти с большими файлами | Обработка JSON в кусочках или использование потоковых подходов |