Jak pracować z pakietowaniem OOXML w .NET

Jak pracować z pakietowaniem OOXML w .NET

Plik XLSX jest archiwum Open Packaging Convention (OPC) ZIP. Aspose.Cells FOSS dla .NET ujawnia podstawową strukturę pakietu za pośrednictwem PackageModel, PackagePartDescriptor, IPackageReader i IPackageWriter. Są to interfejsy API na poziomie infrastruktury, głównie przydatne do diagnostyki i własnych implementacji przechowywania. Zainstaluj za pomocą dotnet add package Aspose.Cells_FOSS.

Przewodnik krok po kroku

Krok 1: Zainstaluj pakiet

dotnet add package Aspose.Cells.FOSS

Krok 2: Zaimportuj przestrzeń nazw

using Aspose.Cells_FOSS;

Krok 3: Obsłuż PackageStructureException

PackageStructureException jest rzucany, gdy pakiet XLSX ma nieprawidłową strukturę OPC (np. brak wymaganych relacji). Łap 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: Zrozum IPackageReader i IPackageWriter

IPackageReader definiuje metodę Read() do odczytu pakietu OPC; IPackageWriter definiuje metodę Write() do zapisu. Biblioteka dostarcza domyślne implementacje oparte na ZIP. Niestandardowe implementacje mogą być dostarczone podczas ładowania z lub zapisywania do pamięci niebędącej systemem plików (np. chmurowe blob’y lub bufor 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 przejrzeć 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 przy unzip -t file.xlsx. Jeśli jest prawidłowy, może być zaszyfrowany — pliki chronione hasłem nie są obsługiwane.

Workbook wczytuje się, ale niektóre treści brakuje. Check LoadDiagnostics.Issues for DataLossRisk = true wpisy. Wskazują one części, które zostały odrzucone podczas naprawy.

Custom IPackageReader nie jest wywoływany. Upewnij się, że użyto przeciążenia konstruktora akceptującego niestandardowy czytnik. Nie wszystkie Workbook przeciążenia konstruktora akceptują niestandardowy czytnik pakietu.

Najczęściej zadawane pytania

Kiedy powinienem zaimplementować IPackageReader lub IPackageWriter?

Tylko wtedy, gdy Twój backend pamięci nie jest lokalnym systemem plików — na przykład, ładowanie bezpośrednio ze strumienia przechowywanego 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 ponownie. Aby zapewnić wierność przy pełnym cyklu części niestandardowych, przetwórz zapisany plik XLSX na poziomie ZIP.

Jaka jest różnica między PackageStructureException a WorkbookLoadException?

PackageStructureException jest błędem poziomu OPC/ZIP (brak typu treści, uszkodzone powiązanie). WorkbookLoadException jest błędem wyższego poziomu przy parsowaniu zawartości XLSX XML.

Zobacz także

 Polski