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");

주요 통찰력 및 모범 사례

  1. ArrayAsTable = true 사용 - 배열의 적절한 표현을 위해 필수적입니다.
  2. 복잡한 계층적 데이터에 대해 여러 워크시트를 만드는 것을 고려하세요.
  3. 출력을 더 읽기 쉽게 만들기 위해 형식을 적용하세요.
  4. 중첩 구조를 더 잘 처리하기 위해 가능한 경우 NestedArrayAsTable = true 사용.
  5. 매우 복잡한 구조의 경우, 가져오기 전에 JSON을 미리 처리하는 것을 고려하세요.

일반적인 문제 및 해결책

문제해결책
중첩 배열이 단일 셀로 나타남ArrayAsTableNestedArrayAsTable 옵션을 활성화하세요.
데이터 관계가 손실됨관계 열이 있는 여러 테이블/시트를 만드세요.
열 이름이 잘못됨DateTimeGroupSeparator 옵션을 사용하여 이름을 사용자 정의하세요.
큰 파일의 메모리 문제JSON을 청크로 처리하거나 스트리밍 접근 방식을 사용하세요.
 한국어