Wie man mit OOXML Packaging in .NET arbeitet
Eine XLSX-Datei ist ein Open Packaging Convention (OPC) ZIP-Archiv. Aspose.Cells FOSS für .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 es 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 verarbeiten
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 Dateien aus nicht vertrauenswürdigen Quellen geladen werden.
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);
}Schritt4: Verstehen Sie IPackageReader und IPackageWriter
IPackageReader definiert eine Read()-Methode zum Lesen eines OPC-Pakets; IPackageWriter definiert eine Write()-Methode zum Schreiben eines solchen Pakets. Die Bibliothek liefert standardmäßige ZIP-basierte Implementierungen. Benutzerdefinierte Implementierungen können bereitgestellt werden, wenn aus einem Nicht-Dateisystem-Speicher geladen oder dorthin 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)");Schritt5: Überprüfen Sie 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 inspizieren.
// 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 ausgelöst mit TryRepairPackage = true. Einige OPC-Strukturfehler liegen außerhalb der automatischen Reparatur (z.B. vollständig fehlende Content-Type-Map). Überprüfen Sie, ob die Datei ein gültiges ZIP ist mit unzip -t file.xlsx. Wenn gültig, könnte sie verschlüsselt sein — passwortgeschützte Dateien werden nicht unterstützt.
Workbook wird geladen, aber ein Teil des Inhalts fehlt. Check LoadDiagnostics.Issues for DataLossRisk = true Einträge. Diese weisen auf Teile hin, die während der Reparatur verworfen 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 in PackageModel beim Speichern erhalten?
Nicht-standardmäßige Teile in UnsupportedParts werden nicht garantiert zurückgeschrieben. Für die Round-Trip-Integrität nicht-standardmäßiger Teile sollten Sie die gespeicherte XLSX-Datei auf ZIP-Ebene nachbearbeiten.
Was ist der Unterschied zwischen PackageStructureException und WorkbookLoadException?
PackageStructureException ist ein OPC/ZIP-Level-Fehler (fehlender Content type, beschädigte Beziehung). WorkbookLoadException ist ein höherstufiger Fehler beim Parsen des XLSX XML-Inhalts.