Как преобразовать JSON-массив в плоский формат для конверсии в Excel с помощью C#

Как преобразовать 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");

Ключевые Инсайты и Лучшие Практики

  1. Используйте ArrayAsTable = true - Это необходимо для правильного представления массивов
  2. Рассмотрите возможность создания нескольких листов для сложных иерархических данных
  3. Применяйте форматирование для улучшения читаемости вывода
  4. Используйте NestedArrayAsTable = true когда это возможно для лучшей обработки вложенных структур
  5. Для чрезвычайно сложных структур рассмотрите возможность предварительной обработки JSON перед импортом

Общие Проблемы и Решения

ПроблемаРешение
Вложенные массивы отображаются как одиночные ячейкиВключите параметры ArrayAsTable и NestedArrayAsTable
Отношения данных потеряныСоздайте несколько таблиц/листов с колонками отношений
Имена столбцов неверныеИспользуйте параметр DateTimeGroupSeparator для настройки именования
Проблемы с памятью при работе с большими файламиОбрабатывайте JSON по частям или используйте потоковые подходы
 Русский