Wie man mit OOXML-Paketierung in .NET arbeitet
Eine XLSX‑Datei ist ein Open Packaging Convention (OPC) ZIP‑Archiv. Aspose.Cells FOSS for .NET stellt die zugrunde liegende Paketstruktur über PackageModel, PackagePartDescriptor, IPackageReader und IPackageWriter bereit. Dies sind Infrastruktur‑APIs, die hauptsächlich für Diagnosen und benutzerdefinierte Speicherimplementierungen nützlich sind. Installieren Sie sie mit dotnet add package Aspose.Cells_FOSS.
Schritt-für-Schritt-Anleitung
Schritt 1: Paket installieren
dotnet add package Aspose.Cells_FOSSSchritt 2: Namespace importieren
using Aspose.Cells_FOSS;Schritt 3: PackageStructureException behandeln
PackageStructureException wird ausgelöst, wenn das XLSX‑Paket eine ungültige OPC‑Struktur hat (z. B. fehlende erforderliche Beziehungen). Fangen Sie es zusammen mit WorkbookLoadException ab, wenn Sie Dateien aus nicht vertrauenswürdigen Quellen laden.
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);
}Schritt 4: IPackageReader und IPackageWriter verstehen
IPackageReader definiert eine Read()‑Methode zum Lesen eines OPC‑Pakets; IPackageWriter definiert eine Write()‑Methode zum Schreiben eines solchen. Die Bibliothek stellt standardmäßige ZIP‑basierte Implementierungen bereit. Benutzerdefinierte Implementierungen können bereitgestellt werden, wenn aus nicht‑Dateisystem‑Speicher geladen oder in diesen gespeichert wird (z. B. Cloud‑Blobs oder In‑Memory‑Puffer).
// 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)");Schritt 5: Überprüfen auf nicht unterstützte Teile
Beim Laden einer XLSX-Datei listet PackageModel.UnsupportedParts Teile auf, die die Bibliothek nicht verarbeitet. Diese werden erhalten, aber nicht interpretiert. Greifen Sie während eines benutzerdefinierten Ladevorgangs auf PackageLoadContext zu, um das Modell zu untersuchen.
// 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.");Häufige Probleme und Lösungen
PackageStructureException wird sogar mit TryRepairPackage = true ausgelöst.
Einige strukturelle OPC-Fehler können nicht automatisch repariert werden (z. B. vollständig fehlende content‑type‑Map). Überprüfen Sie, ob die Datei ein gültiges ZIP mit unzip -t file.xlsx ist. Wenn sie gültig ist, könnte sie verschlüsselt sein – passwortgeschützte Dateien werden nicht unterstützt.
Workbook lädt, aber ein Teil des Inhalts fehlt.
Check LoadDiagnostics.Issues für DataLossRisk = true‑Einträge. Diese zeigen Teile an, die während der Reparatur entfernt wurden.
Custom IPackageReader wird nicht aufgerufen.
Stellen Sie sicher, dass die Konstruktorüberladung verwendet wird, die den benutzerdefinierten Reader akzeptiert. Nicht alle Workbook‑Konstruktorüberladungen akzeptieren einen benutzerdefinierten Paket‑Reader.
Häufig gestellte Fragen
Wann sollte ich IPackageReader oder IPackageWriter implementieren?
Nur wenn Ihr Speicher‑Backend nicht das lokale Dateisystem ist — zum Beispiel, wenn Sie direkt aus einem Cloud‑Speicher‑Stream laden, ohne eine temporäre Datei zu erstellen.
Werden nicht unterstützte Teile im PackageModel beim Speichern beibehalten?
Nichtstandardteile in UnsupportedParts werden nicht garantiert zurückgeschrieben. Für die Rundreise‑Treue von Nichtstandardteilen bearbeiten Sie die gespeicherte XLSX-Datei auf ZIP‑Ebene nach.
Was ist der Unterschied zwischen PackageStructureException und WorkbookLoadException?
PackageStructureException ist ein OPC/ZIP‑Ebene‑Fehler (fehlender Content‑Typ, beschädigte Beziehung). WorkbookLoadException ist ein Fehler auf höherer Ebene beim Parsen des XLSX‑XML‑Inhalts.