如何使用C#将JSON数组扁平化以进行Excel转换

如何使用C#将JSON数组扁平化以进行Excel转换

当处理现代 API 和 Web 服务时,开发人员常常会遇到复杂的 JSON 结构,其中包含深度嵌套的数组和对象。将这些层次结构转换为平面的 Excel 表格是一个重大挑战。本指南演示了如何使用 Aspose.Cells for .NET 有效地将嵌套的 JSON 数组转换为 Excel。

挑战:复杂的嵌套 JSON 结构

考虑以下来自 Web API 的典型 JSON 响应:

{
  "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 for .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 以提取和展平员工数据
// 注意:这需要像 Newtonsoft.Json 这样的 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

常见问题及解决方案

问题解决方案
嵌套数组显示为单个单元格启用 ArrayAsTableNestedArrayAsTable 选项
数据关系丢失创建多个表/工作表并带有关系列
列名不正确使用 DateTimeGroupSeparator 选项自定义命名
大文件的内存问题分块处理 JSON 或使用流式处理方法
 中文