Praca z pakowaniem OOXML
Praca z pakowaniem OOXML
Plik XLSX jest archiwum Open Packaging Convention (OPC) ZIP. Aspose.Cells FOSS dla .NET udostępnia warstwę pakietu poprzez IPackageReader, IPackageWriter oraz graf obiektów PackageModel. Są to niskopoziomowe API przeznaczone do diagnostyki i narzędzi — większość aplikacji używa tylko klasy wysokiego poziomu Workbook.
Model pakietu
PackageModel reprezentuje logiczną zawartość archiwum XLSX. Udostępnia trzy kolekcje: Parts (wszystkie części zawartości), Relationships (wpisy relacji OPC) oraz UnsupportedParts (części obecne w pliku, których biblioteka nie przetwarza). Każda część jest opisana przez PackagePartDescriptor z PartUri, ContentType i Category.
using Aspose.Cells_FOSS;
// PackageModel is accessed via PackageLoadContext during custom load flows
// The following illustrates the object structure
// var context = new PackageLoadContext(workbook, packageModel);
// var model = context.Package;
// foreach (var part in model.Parts)
// {
// Console.WriteLine($"URI={part.PartUri}, Type={part.ContentType}");
// }
// Console.WriteLine("Unsupported parts: " + model.UnsupportedParts.Count);Note:
PackageModeljest wypełniane wewnętrznie podczas ładowania pliku XLSX. Bezpośrednia instancjacja nie jest częścią standardowego wysokopoziomowego przepływu pracy.
IPackageReader i IPackageWriter
IPackageReader definiuje pojedynczą metodę Read() do odczytu pakietu OPC. IPackageWriter definiuje pojedynczą metodę Write() do jego zapisu. Interfejsy te są implementowane przez wewnętrzny czytnik/pisarz biblioteki oparty na ZIP i mogą być dostarczane przez własne implementacje w scenariuszach pamięci podręcznej lub przechowywania w chmurze.
// Signature reference — not a complete runnable example
// public interface IPackageReader { void Read(...); }
// public interface IPackageWriter { void Write(...); }PackageStructureException
PackageStructureException jest zgłaszany, gdy struktura pakietu XLSX jest zasadniczo niepoprawna — na przykład, gdy brakuje wymaganych relacji OPC. Rozszerza ogólną hierarchię wyjątków i zawiera komunikat opisujący, które invariant strukturalny został naruszony.
using Aspose.Cells_FOSS;
var opts = new LoadOptions { TryRepairPackage = true };
try
{
var wb = new Workbook("bad.xlsx", opts);
}
catch (PackageStructureException ex)
{
Console.WriteLine("OPC structure error: " + ex.Message);
}
catch (WorkbookLoadException ex)
{
Console.WriteLine("Load error: " + ex.Message);
}Wskazówki i najlepsze praktyki
- Użyj
PackageModel.UnsupportedParts, aby wykryć niestandardowe części, które mogą być cicho pomijane podczas pełnego cyklu. - Przechwytuj
PackageStructureExceptionopróczWorkbookLoadExceptionpodczas ładowania plików z niepewnych źródeł. - Interfejsy
IPackageReader/IPackageWritersą punktami rozszerzeń; implementuj je tylko wtedy, gdy potrzebujesz niestandardowego przechowywania (np. ładowanie z chmurowego blobu bez pliku lokalnego). - Dla większości diagnostyk,
LoadDiagnostics(dostępny przezWorkbook.LoadDiagnostics) jest wystarczający — przechodzenie do warstwy pakietu jest rzadko konieczne.
Typowe problemy
| Problem | Przyczyna | Naprawa |
|---|---|---|
PackageStructureException przy ładowaniu | Brak wymaganego powiązania OPC | Ustaw TryRepairPackage = true w LoadOptions; sprawdź LoadDiagnostics.Issues po załadowaniu |
UnsupportedParts nie jest pusty | Plik zawiera niestandardowe rozszerzenia | Te części są zachowywane dosłownie przy zapisie, jeśli były obecne przy wczytywaniu |
Niestandardowy IPackageReader nie został wywołany | Przekazano do nieprawidłowego przeciążenia konstruktora | Upewnij się, że użyto LoadOptions lub przeciążenia konstruktora akceptującego niestandardowy czytnik |
FAQ
Czy muszę używać IPackageReader/IPackageWriter do normalnej pracy z arkuszami kalkulacyjnymi?
Nie. Te interfejsy są punktami rozszerzeń dla zaawansowanych scenariuszy. Wszystkie standardowe operacje odczytu/zapisu przechodzą bezpośrednio przez Workbook.
Czy nieobsługiwane części są zachowywane przy zapisie?
Części wymienione w PackageModel.UnsupportedParts nie są przetwarzane i mogą nie zostać zapisane ponownie. Jeśli wymagana jest wierność round-trip dla części niestandardowych, użyj etapu post-przetwarzania na poziomie zip.
Jaka jest różnica między PackageStructureException a WorkbookLoadException?
PackageStructureException wskazuje na błąd na poziomie OPC/ZIP (brak typu zawartości, uszkodzony związek). WorkbookLoadException wskazuje na błąd wyższego poziomu parsowania lub semantyczny w treści XLSX.
API Reference Podsumowanie
| Klasa / Interfejs | Opis |
|---|---|
IPackageReader | Interfejs do odczytu pakietu OPC (metoda Read) |
IPackageWriter | Interfejs do zapisu pakietu OPC (Write method) |
PackageLoadContext | Łączy Workbook z jego PackageModel |
PackageLoadContext.Package | Zwraca PackageModel |
PackageModel.Parts | Wszystkie części treści w pakiecie |
PackageModel.Relationships | Wpisy relacji OPC |
PackageModel.UnsupportedParts | Części nie przetwarzane przez bibliotekę |
PackagePartDescriptor.PartUri | URI OPC dla części |
PackagePartDescriptor.ContentType | Typ MIME zawartości części |
PackagePartDescriptor.Category | Kategoria logiczna (arkusz, style, itp.) |
PackageStructureException | Rzucany przy naruszeniach strukturalnych OPC |