Как преобразовать JSON-массив в плоский формат для конверсии в Excel с помощью C#
Когда разработчики работают с современными API и веб-сервисами, они часто сталкиваются со сложными структурами JSON с глубоко вложенными массивами и объектами. Преобразование этих иерархических структур в плоские таблицы Excel представляет собой значительную проблему. Этот гид демонстрирует, как эффективно преобразовать вложенные массивы JSON в Excel с использованием Aspose.Cells для .NET.
Проблема: Сложные Вложенные Структуры JSON
Рассмотрим этот типичный ответ 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 создает несколько проблем:
- Как обрабатывать несколько вложенных массивов (отделы, сотрудники, навыки)
- Как поддерживать отношения между родительскими и дочерними элементами
- Как создать читаемую структуру таблицы
Пошаговое Решение
Шаг 1: Установите Aspose.Cells
Сначала установите Aspose.Cells для .NET:
dotnet add package Aspose.Cells
Шаг 2: Настройте JsonLayoutOptions
Создайте правильно настроенные JsonLayoutOptions для обработки массивов:
using Aspose.Cells;
using Aspose.Cells.Utility;
// Создайте JsonLayoutOptions с обработкой массивов
JsonLayoutOptions options = new JsonLayoutOptions();
options.ArrayAsTable = true; // Крайне важно для правильного упрощения
options.ConvertNumericOrDate = true;
options.IgnoreNull = true;
Шаг 3: Загрузите Сложные Данные JSON
Загрузите ваши сложные вложенные данные JSON:
// Пример JSON с вложенными массивами
string jsonData = File.ReadAllText("complex_data.json");
// Инициализируйте книгу и лист
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];
Шаг 4: Настройте Расширенное Упрощение
Для сложных вложенных структур реализуйте собственное решение по упрощению:
// Определите начальную позицию ячейки
int startRow = 0;
int startColumn = 0;
// Импортируйте данные JSON с нашими настроенными опциями
JsonUtility.ImportData(jsonData, worksheet.Cells, startRow, startColumn, options);
Шаг 5: Обработка Многоуровневых Вложенных Массивов
Для сложных многоуровневых массивов нам потребуется дополнительная обработка:
// Создайте второй лист для детализированных данных о сотрудниках
Worksheet employeeSheet = workbook.Worksheets.Add("Employees");
int empRow = 0;
// Добавьте заголовки для листа сотрудников
string[] headers = { "Department", "Employee ID", "Employee Name", "Skills" };
for (int i = 0; i < headers.Length; i++)
{
employeeSheet.Cells[empRow, i].PutValue(headers[i]);
}
empRow++;
// Разберите JSON для извлечения и упрощения данных о сотрудниках
// Примечание: Это потребует библиотеки для разбора JSON, такой как 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: Примените Профессиональное Форматирование
Улучшите читаемость с помощью правильного форматирования:
// Форматируйте оба листа как таблицы с заголовками
worksheet.ListObjects.Add(0, 0, worksheet.Cells.LastCell.Row, worksheet.Cells.LastCell.Column, true);
employeeSheet.ListObjects.Add(0, 0, empRow - 1, 3, true);
// Автоподгоните столбцы для лучшей читаемости
worksheet.AutoFitColumns();
employeeSheet.AutoFitColumns();
Шаг 7: Сохраните Результат
Экспортируйте книгу с упрощенными данными:
// Сохраните как файл Excel
workbook.Save("flattened_data.xlsx");
Упрощенное Решение с Использованием Aspose.Cells
Для многих сценариев Aspose.Cells предоставляет более простой подход с использованием встроенной обработки JSON:
// Инициализируйте книгу
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];
// Настройте параметры импорта JSON
JsonLayoutOptions options = new JsonLayoutOptions
{
ArrayAsTable = true,
ConvertNumericOrDate = true,
IgnoreNull = true,
TitleStyle = new CellsFactory().CreateStyle(),
NestedArrayAsTable = true // Важно для вложенных массивов
};
// Установите стиль заголовка для лучшей читаемости
options.TitleStyle.Font.IsBold = true;
// Импортируйте JSON
JsonUtility.ImportData(jsonData, sheet.Cells, 0, 0, options);
// Сохраните результат
workbook.Save("flattened_output.xlsx");
Ключевые Инсайты и Лучшие Практики
- Используйте
ArrayAsTable = true
- Это необходимо для правильного представления массивов - Рассмотрите возможность создания нескольких листов для сложных иерархических данных
- Применяйте форматирование для улучшения читаемости вывода
- Используйте
NestedArrayAsTable = true
когда это возможно для лучшей обработки вложенных структур - Для чрезвычайно сложных структур рассмотрите возможность предварительной обработки JSON перед импортом
Общие Проблемы и Решения
Проблема | Решение |
---|---|
Вложенные массивы отображаются как одиночные ячейки | Включите параметры ArrayAsTable и NestedArrayAsTable |
Отношения данных потеряны | Создайте несколько таблиц/листов с колонками отношений |
Имена столбцов неверные | Используйте параметр DateTimeGroupSeparator для настройки именования |
Проблемы с памятью при работе с большими файлами | Обрабатывайте JSON по частям или используйте потоковые подходы |