כיצד לעבוד עם אריזת OOXML ב‑.NET

כיצד לעבוד עם אריזת 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

שלב 2: ייבא את מרחב השמות

using Aspose.Cells_FOSS;

שלב 3: טיפול ב‑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. ניתן לספק מימושים מותאמים אישית בעת טעינה מ או שמירה אל אחסון שאינו קובץ (למשל, בלובים בענן או חוצצים בזיכרון).

// 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 חורגים מתיקון אוטומטי (למשל, מפת סוג‑תוכן חסרה לחלוטין). אמת שהקובץ הוא ZIP תקין באמצעות unzip -t file.xlsx. אם הוא תקין, ייתכן שהוא מוצפן — קבצים המוגנים בסיסמה אינם נתמכים.

Workbook טוען אך חלק מהתוכן חסר.
בדוק LoadDiagnostics.Issues עבור ערכי DataLossRisk = true. אלה מצביעים על חלקים שנפלו במהלך התיקון.

המתאם המותאם אישית IPackageReader אינו נקרא.
ודא שהגרסה העודפת של הקונסטרוקטור שמקבלת את הקורא המותאם אישית משומשת. לא כל הגרסאות העודפות של הקונסטרוקטור Workbook מקבלות קורא חבילה מותאם אישית.

שאלות נפוצות

מתי עלי לממש את IPackageReader או את IPackageWriter?

רק כאשר גיבוי האחסון שלך אינו מערכת הקבצים המקומית — לדוגמה, טעינה ישירה מזרם אחסון ענן ללא יצירת קובץ זמני.

האם חלקים שאינם נתמכים ב‑PackageModel נשמרים בעת השמירה?

חלקים לא‑סטנדרטיים בUnsupportedParts אינם מובטחים שייכתבו חזרה. כדי לשמור על נאמנות של חלקים לא‑סטנדרטיים בתהליך סיבוב, יש לבצע עיבוד פוסט‑פרוסס לקובץ XLSX השמור ברמת ה‑ZIP.

מה ההבדל בין PackageStructureException ל‑WorkbookLoadException?

PackageStructureException הוא כשל ברמת OPC/ZIP (סוג תוכן חסר, קשר שבור). WorkbookLoadException הוא כשל ברמה גבוהה יותר בניתוח תוכן ה‑XML של XLSX.

ראה גם

 עברית