Cách làm phẳng mảng JSON để chuyển đổi sang Excel bằng C#

Cách làm phẳng mảng JSON để chuyển đổi sang Excel bằng C#

Khi làm việc với các API hiện đại và dịch vụ web, các nhà phát triển thường xuyên gặp phải các cấu trúc JSON phức tạp với các mảng và đối tượng lồng nhau sâu. Việc chuyển đổi các cấu trúc phân cấp này thành các bảng Excel phẳng là một thách thức lớn. Hướng dẫn này sẽ chỉ cho bạn cách chuyển đổi hiệu quả các mảng JSON lồng nhau sang Excel bằng Aspose.Cells for .NET.

Thách Thức: Cấu Trúc JSON Lồng Nhau Phức Tạp

Hãy xem xét phản hồi JSON điển hình từ một API web:

{
  "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"]
        }
      ]
    }
  ]
}

Việc chuyển đổi dữ liệu phân cấp này thành một bảng Excel phẳng tạo ra một số thách thức:

  • Cách xử lý nhiều mảng lồng nhau (các phòng ban, nhân viên, kỹ năng)
  • Cách duy trì mối quan hệ giữa các mục cha và con
  • Cách tạo cấu trúc bảng tính dễ đọc

Giải Pháp Từng Bước

Bước 1: Cài Đặt Aspose.Cells

Đầu tiên, cài đặt Aspose.Cells for .NET:

dotnet add package Aspose.Cells

Bước 2: Thiết Lập JsonLayoutOptions

Tạo JsonLayoutOptions được cấu hình đúng để xử lý các mảng:

using Aspose.Cells;
using Aspose.Cells.Utility;

// Tạo JsonLayoutOptions với xử lý mảng
JsonLayoutOptions options = new JsonLayoutOptions();
options.ArrayAsTable = true;  // Quan trọng để làm phẳng đúng cách
options.ConvertNumericOrDate = true;
options.IgnoreNull = true;

Bước 3: Tải Dữ Liệu JSON Phức Tạp

Tải dữ liệu JSON lồng nhau phức tạp của bạn:

// JSON mẫu với các mảng lồng nhau
string jsonData = File.ReadAllText("complex_data.json");

// Khởi tạo workbook và worksheet
Workbook workbook = new Workbook();
Worksheet worksheet = workbook.Worksheets[0];

Bước 4: Cấu Hình Làm Phẳng Nâng Cao

Đối với các cấu trúc lồng nhau nâng cao, triển khai một giải pháp làm phẳng tùy chỉnh:

// Định nghĩa vị trí ô bắt đầu
int startRow = 0;
int startColumn = 0;

// Nhập dữ liệu JSON với các tùy chọn đã cấu hình
JsonUtility.ImportData(jsonData, worksheet.Cells, startRow, startColumn, options);

Bước 5: Xử Lý Các Mảng Lồng Nhau Nhiều Cấp

Đối với các mảng phức tạp nhiều cấp, chúng ta cần xử lý bổ sung:

// Tạo một worksheet thứ hai cho dữ liệu nhân viên chi tiết
Worksheet employeeSheet = workbook.Worksheets.Add("Employees");
int empRow = 0;

// Thêm tiêu đề cho bảng nhân viên
string[] headers = { "Department", "Employee ID", "Employee Name", "Skills" };
for (int i = 0; i < headers.Length; i++)
{
    employeeSheet.Cells[empRow, i].PutValue(headers[i]);
}
empRow++;

// Phân tích JSON để trích xuất và làm phẳng dữ liệu nhân viên
// Lưu ý: Điều này sẽ yêu cầu một thư viện phân tích JSON như 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++;
//     }
// }

Bước 6: Áp Dụng Định Dạng Chuyên Nghiệp

Tăng cường khả năng đọc với định dạng phù hợp:

// Định dạng cả hai worksheet dưới dạng bảng với tiêu đề
worksheet.ListObjects.Add(0, 0, worksheet.Cells.LastCell.Row, worksheet.Cells.LastCell.Column, true);
employeeSheet.ListObjects.Add(0, 0, empRow - 1, 3, true);

// Tự động điều chỉnh cột để dễ đọc hơn
worksheet.AutoFitColumns();
employeeSheet.AutoFitColumns();

Bước 7: Lưu Kết Quả

Xuất workbook với dữ liệu đã làm phẳng:

// Lưu dưới dạng tệp Excel
workbook.Save("flattened_data.xlsx");

Giải Pháp Đơn Giản Hơn Sử Dụng Aspose.Cells

Đối với nhiều kịch bản, Aspose.Cells cung cấp một cách tiếp cận đơn giản hơn bằng cách sử dụng khả năng xử lý JSON tích hợp sẵn:

// Khởi tạo workbook
Workbook workbook = new Workbook();
Worksheet sheet = workbook.Worksheets[0];

// Cấu hình tùy chọn nhập JSON
JsonLayoutOptions options = new JsonLayoutOptions
{
    ArrayAsTable = true,
    ConvertNumericOrDate = true,
    IgnoreNull = true,
    TitleStyle = new CellsFactory().CreateStyle(),
    NestedArrayAsTable = true  // Quan trọng cho các mảng lồng nhau
};

// Đặt kiểu tiêu đề để dễ đọc hơn
options.TitleStyle.Font.IsBold = true;

// Nhập JSON
JsonUtility.ImportData(jsonData, sheet.Cells, 0, 0, options);

// Lưu kết quả
workbook.Save("flattened_output.xlsx");

Những Kiến Thức Chính và Thực Hành Tốt Nhất

  1. Sử dụng ArrayAsTable = true - Điều này rất quan trọng để đại diện đúng cho các mảng
  2. Xem xét việc tạo nhiều worksheet cho dữ liệu phân cấp phức tạp
  3. Áp dụng định dạng để làm cho đầu ra dễ đọc hơn
  4. Sử dụng NestedArrayAsTable = true khi có sẵn để xử lý tốt hơn các cấu trúc lồng nhau
  5. Đối với các cấu trúc cực kỳ phức tạp, hãy xem xét việc tiền xử lý JSON trước khi nhập

Các Vấn Đề Thường Gặp và Giải Pháp

Vấn ĐềGiải Pháp
Các mảng lồng nhau xuất hiện dưới dạng ô đơnBật tùy chọn ArrayAsTableNestedArrayAsTable
Mối quan hệ dữ liệu bị mấtTạo nhiều bảng/worksheet với các cột quan hệ
Tên cột không chính xácSử dụng tùy chọn DateTimeGroupSeparator để tùy chỉnh đặt tên
Vấn đề bộ nhớ với các tệp lớnXử lý JSON theo từng khối hoặc sử dụng các phương pháp streaming
 Tiếng Việt