Jak pracować z pakowaniem OOXML w .NET
Plik XLSX jest archiwum ZIP zgodnym z Open Packaging Convention (OPC). Aspose.Cells FOSS for .NET udostępnia strukturę pakietu poprzez PackageModel, PackagePartDescriptor, IPackageReader i IPackageWriter. Są to interfejsy na poziomie infrastruktury, przydatne głównie do diagnostyki i własnych implementacji przechowywania. Zainstaluj przy użyciu dotnet add package Aspose.Cells_FOSS.
Przewodnik krok po kroku
Krok 1: Zainstaluj pakiet
dotnet add package Aspose.Cells_FOSSKrok 2: Importuj przestrzeń nazw
using Aspose.Cells_FOSS;Krok 3: Obsłuż PackageStructureException
PackageStructureException jest zgłaszany, gdy pakiet XLSX ma nieprawidłową strukturę OPC (np. brak wymaganych relacji). Przechwytuj go razem z WorkbookLoadException podczas ładowania plików z niepewnych źródeł.
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);
}Krok 4: Zrozumienie IPackageReader i IPackageWriter
IPackageReader definiuje metodę Read() do odczytu pakietu OPC; IPackageWriter definiuje metodę Write() do zapisu. Biblioteka zapewnia domyślne implementacje oparte na ZIP. Niestandardowe implementacje mogą być dostarczane podczas ładowania z lub zapisywania do pamięci niebędącej systemem plików (np. chmurowe blob’y lub bufory w pamięci).
// 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)");Krok 5: Sprawdź nieobsługiwane części
Podczas ładowania pliku XLSX, PackageModel.UnsupportedParts wymienia części, których biblioteka nie przetwarza. Są one zachowywane, ale nie interpretowane. Uzyskaj dostęp do PackageLoadContext w trakcie niestandardowego przepływu ładowania, aby zbadać model.
// 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.");Typowe problemy i rozwiązania
PackageStructureException jest zgłaszany nawet przy TryRepairPackage = true.
Niektóre strukturalne błędy OPC wykraczają poza automatyczną naprawę (np. całkowicie brakująca mapa content-type). Zweryfikuj, czy plik jest prawidłowym ZIP-em przy użyciu unzip -t file.xlsx. Jeśli jest prawidłowy, może być zaszyfrowany — pliki chronione hasłem nie są obsługiwane.
Workbook ładuje się, ale brakuje części treści.
Sprawdź LoadDiagnostics.Issues pod kątem wpisów DataLossRisk = true. Wskazują one części, które zostały pominięte podczas naprawy.
Custom IPackageReader nie jest wywoływany.
Upewnij się, że użyto przeciążenia konstruktora, które przyjmuje niestandardowy czytnik. Nie wszystkie przeciążenia konstruktora Workbook akceptują niestandardowy czytnik pakietu.
Najczęściej zadawane pytania
Kiedy powinienem zaimplementować IPackageReader lub IPackageWriter?
Tylko wtedy, gdy Twój backend przechowywania nie jest lokalnym systemem plików — na przykład przy ładowaniu bezpośrednio ze strumienia przechowywania w chmurze bez tworzenia pliku tymczasowego.
Czy nieobsługiwane części w PackageModel są zachowywane przy zapisie?
Części niestandardowe w UnsupportedParts nie są gwarantowane do zapisania z powrotem. Aby zapewnić wierność przy dwukierunkowym przetwarzaniu części niestandardowych, przetwórz zapisany plik XLSX na poziomie ZIP.
Jaka jest różnica między PackageStructureException a WorkbookLoadException?
PackageStructureException jest błędem na poziomie OPC/ZIP (brak typu zawartości, uszkodzony związek). WorkbookLoadException jest błędem wyższego poziomu przy analizie zawartości XML XLSX.