نحوه کار با بستهبندی OOXML در .NET
یک فایل XLSX یک آرشیو ZIP بر پایه Open Packaging Convention (OPC) است. Aspose.Cells FOSS for .NET ساختار بسته زیرین را از طریق PackageModel، PackagePartDescriptor، IPackageReader و IPackageWriter در دسترس قرار میدهد. اینها APIهای سطح زیرساخت هستند که عمدتاً برای تشخیص و پیادهسازیهای ذخیرهسازی سفارشی مفیدند. با dotnet add package Aspose.Cells_FOSS نصب کنید.
راهنمای گام به گام
مرحله 1: نصب بسته
dotnet add package Aspose.Cells_FOSSمرحله ۲: وارد کردن فضای نام
using Aspose.Cells_FOSS;مرحله ۳: مدیریت PackageStructureException
PackageStructureException زمانی پرتاب میشود که بسته XLSX ساختار OPC نامعتبری داشته باشد (مثلاً روابط مورد نیاز موجود نباشند). هنگام بارگذاری فایلها از منابع غیرقابل اعتماد، آن را همراه با WorkbookLoadException بگیرید.
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);
}مرحله 4: درک IPackageReader و IPackageWriter
IPackageReader یک روش Read() برای خواندن یک بسته OPC تعریف میکند؛ IPackageWriter یک روش Write() برای نوشتن آن تعریف میکند. کتابخانه پیادهسازیهای پیشفرض مبتنی بر ZIP را فراهم میآورد. میتوان پیادهسازیهای سفارشی را هنگام بارگذاری یا ذخیرهسازی در ذخیرهسازی غیرفایلسیستمی (مثلاً blobهای ابری یا بافرهای حافظه) ارائه داد.
// 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)");مرحله 5: بررسی قطعات پشتیبانینشده
هنگام بارگذاری یک فایل XLSX، PackageModel.UnsupportedParts بخشهایی را که کتابخانه پردازش نمیکند فهرست میکند. این بخشها حفظ میشوند اما تفسیر نمیشوند. برای بررسی مدل، در جریان بارگذاری سفارشی به PackageLoadContext دسترسی پیدا کنید.
// 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.");مسائل رایج و راهحلها
PackageStructureException حتی با TryRepairPackage = true نیز پرتاب میشود.
برخی از شکستهای ساختاری OPC فراتر از تعمیر خودکار هستند (مثلاً نقشه content‑type بهطور کامل گم شده باشد). فایل را با unzip -t file.xlsx بررسی کنید که یک ZIP معتبر است. اگر معتبر باشد، ممکن است رمزگذاری شده باشد — فایلهای محافظتشده با رمز عبور پشتیبانی نمیشوند.
Workbook بارگذاری میشود اما برخی محتواها گم شدهاند.
LoadDiagnostics.Issues را برای ورودیهای DataLossRisk = true بررسی کنید. اینها نشان میدهند که بخشهایی در طول تعمیر حذف شدهاند.
IPackageReader سفارشی فراخوانی نمیشود.
اطمینان حاصل کنید که نسخهٔ سازندهای که خوانندهٔ سفارشی را میپذیرد، استفاده شود. همهٔ overloadهای سازندهٔ Workbook خوانندهٔ بستهٔ سفارشی را نمیپذیرند.
سوالات متداول
چه زمانی باید IPackageReader یا IPackageWriter را پیادهسازی کنم؟
فقط زمانی که پشتیبان ذخیرهسازی شما سیستم فایل محلی نیست — برای مثال، بارگذاری مستقیم از یک جریان ذخیرهسازی ابری بدون ایجاد فایل موقت.
آیا بخشهای پشتیبانینشده در PackageModel هنگام ذخیرهسازی حفظ میشوند؟
قسمتهای غیر استاندارد در UnsupportedParts تضمین نمیشود که بازنویسی شوند. برای حفظ صحت دورانی قسمتهای غیر استاندارد، پس از ذخیرهسازی XLSX را در سطح ZIP پردازش کنید.
تفاوت بین PackageStructureException و WorkbookLoadException چیست؟
PackageStructureException یک خطای سطح OPC/ZIP است (نوع محتوا گم شده، رابطه خراب). WorkbookLoadException یک خطای سطح بالاتر در تجزیه محتوای XML XLSX است.