C#로 Excel 변환을 위한 JSON 배열 평탄화 방법
C#로 Excel 변환을 위한 JSON 배열 평탄화 방법
현대 API 및 웹 서비스에서 작업할 때 개발자는 종종 깊게 중첩된 배열과 객체를 가진 복잡한 JSON 구조를 접하게 됩니다. 이러한 계층적 구조를 평면 Excel 테이블로 변환하는 것은 상당한 도전 과제가 됩니다. 이 가이드는 Aspose.Cells for .NET을 사용하여 중첩된 JSON 배열을 Excel로 효과적으로 변환하는 방법을 보여줍니다.
도전 과제: 복잡한 중첩 JSON 구조
웹 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을 청크로 처리하거나 스트리밍 접근 방식을 사용하세요. |