如何使用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");
关键见解和最佳实践
- 使用
ArrayAsTable = true
- 这对于正确表示数组至关重要 - 考虑为复杂的层次数据创建多个工作表
- 应用格式 使输出更具可读性
- 在可用时使用
NestedArrayAsTable = true
以更好地处理嵌套结构 - 对于极其复杂的结构,考虑在导入之前预处理 JSON
常见问题及解决方案
问题 | 解决方案 |
---|---|
嵌套数组显示为单个单元格 | 启用 ArrayAsTable 和 NestedArrayAsTable 选项 |
数据关系丢失 | 创建多个表/工作表并带有关系列 |
列名不正确 | 使用 DateTimeGroupSeparator 选项自定义命名 |
大文件的内存问题 | 分块处理 JSON 或使用流式处理方法 |