Cách làm việc với gói OOXML trong .NET

Cách làm việc với gói OOXML trong .NET

Tệp XLSX là một tệp ZIP theo chuẩn Open Packaging Convention (OPC). Aspose.Cells FOSS for .NET cung cấp cấu trúc gói cơ bản thông qua PackageModel, PackagePartDescriptor, IPackageReaderIPackageWriter. Đây là các API cấp hạ tầng, chủ yếu hữu ích cho việc chẩn đoán và triển khai lưu trữ tùy chỉnh. Cài đặt bằng dotnet add package Aspose.Cells_FOSS.

Hướng Dẫn Từng Bước

Bước 1: Cài đặt Gói

dotnet add package Aspose.Cells_FOSS

Bước 2: Nhập không gian tên

using Aspose.Cells_FOSS;

Bước 3: Xử lý PackageStructureException

PackageStructureException được ném ra khi gói XLSX có cấu trúc OPC không hợp lệ (ví dụ: thiếu các mối quan hệ bắt buộc). Bắt nó cùng với WorkbookLoadException khi tải các tệp từ nguồn không đáng tin cậy.

using Aspose.Cells_FOSS;

var opts = new LoadOptions { TryRepairPackage = true };

try
{
    var wb = new Workbook("suspect.xlsx", opts);
    Console.WriteLine("Loaded: " + wb.Worksheets.Count + " sheet(s)");
}
catch (PackageStructureException ex)
{
    Console.WriteLine("OPC structure invalid: " + ex.Message);
}
catch (WorkbookLoadException ex)
{
    Console.WriteLine("Load error: " + ex.Message);
}

Bước 4: Hiểu IPackageReader và IPackageWriter

IPackageReader định nghĩa một phương thức Read() để đọc một gói OPC; IPackageWriter định nghĩa một phương thức Write() để ghi một gói. Thư viện cung cấp các triển khai mặc định dựa trên ZIP. Các triển khai tùy chỉnh có thể được cung cấp khi tải từ hoặc lưu vào bộ nhớ không phải hệ thống tệp (ví dụ: blob đám mây hoặc bộ đệm trong bộ nhớ).

// Signature reference
// public interface IPackageReader { void Read(/* ... */); }
// public interface IPackageWriter { void Write(/* ... */); }
//
// Standard usage: pass a Stream to the Workbook constructor
using Aspose.Cells_FOSS;
using System.IO;

byte[] fileBytes = File.ReadAllBytes("data.xlsx");
using var ms = new MemoryStream(fileBytes);
var wb = new Workbook(ms);
Console.WriteLine("Loaded from stream: " + wb.Worksheets.Count + " sheet(s)");

Bước 5: Kiểm tra các phần không được hỗ trợ

Khi tải tệp XLSX, PackageModel.UnsupportedParts liệt kê các phần mà thư viện không xử lý. Những phần này được giữ lại nhưng không được giải thích. Truy cập PackageLoadContext trong quá trình tải tùy chỉnh để kiểm tra mô hình.

// PackageModel is populated internally during Workbook construction.
// Use LoadDiagnostics to detect load-time structural warnings without
// dropping to the PackageModel level directly.
using Aspose.Cells_FOSS;

var opts = new LoadOptions { TryRepairPackage = true, TryRepairXml = true };
var wb = new Workbook("file.xlsx", opts);
var diag = wb.LoadDiagnostics;
if (diag.HasRepairs)
    Console.WriteLine("Package had " + diag.Issues.Count() + " repair entries.");

Các vấn đề thường gặp và cách khắc phục

PackageStructureException được ném ngay cả khi có TryRepairPackage = true. Một số lỗi cấu trúc OPC vượt quá khả năng sửa chữa tự động (ví dụ: bản đồ content-type hoàn toàn thiếu). Xác minh tệp là ZIP hợp lệ bằng unzip -t file.xlsx. Nếu hợp lệ, có thể nó đã được mã hóa — các tệp được bảo vệ bằng mật khẩu không được hỗ trợ.

Workbook tải nhưng một số nội dung bị thiếu.
Kiểm tra LoadDiagnostics.Issues để tìm các mục DataLossRisk = true. Những mục này cho thấy các phần đã bị loại bỏ trong quá trình sửa chữa.

Custom IPackageReader không được gọi. Đảm bảo rằng overload của constructor chấp nhận trình đọc tùy chỉnh được sử dụng. Không phải tất cả overload của constructor Workbook đều chấp nhận trình đọc gói tùy chỉnh.

Câu hỏi thường gặp

Khi nào tôi nên triển khai IPackageReader hoặc IPackageWriter?

Chỉ khi backend lưu trữ của bạn không phải là hệ thống tệp cục bộ — ví dụ, tải trực tiếp từ luồng lưu trữ đám mây mà không tạo tệp tạm thời.

Các phần không được hỗ trợ trong PackageModel có được giữ lại khi lưu không?

Các phần không chuẩn trong UnsupportedParts không được đảm bảo sẽ được ghi lại. Để duy trì độ trung thực vòng quay của các phần không chuẩn, hãy xử lý hậu kỳ tệp XLSX đã lưu ở mức ZIP.

Sự khác biệt giữa PackageStructureException và WorkbookLoadException là gì?

PackageStructureException là lỗi mức OPC/ZIP (thiếu loại nội dung, mối quan hệ bị hỏng). WorkbookLoadException là lỗi mức cao hơn trong việc phân tích nội dung XML của XLSX.

Xem thêm

 Tiếng Việt