Jak pracovat s balíčkováním OOXML v .NET
Soubor XLSX je archiv ZIP podle Open Packaging Convention (OPC). Aspose.Cells FOSS pro .NET odhaluje podkladovou strukturu balíčku prostřednictvím PackageModel, PackagePartDescriptor, IPackageReader a IPackageWriter. Jedná se o API na úrovni infrastruktury, která jsou především užitečná pro diagnostiku a vlastní implementace úložiště. Nainstalujte pomocí dotnet add package Aspose.Cells_FOSS.
Průvodce krok za krokem
Krok 1: Nainstalujte balíček
dotnet add package Aspose.Cells.FOSSKrok 2: Importujte jmenný prostor
using Aspose.Cells_FOSS;Krok 3: Zpracujte PackageStructureException
PackageStructureException je vyvoláno, když má balíček XLSX neplatnou strukturu OPC (např. chybějící požadované vztahy). Zachyťte jej spolu s WorkbookLoadException při načítání souborů z nedůvěryhodných zdrojů.
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: Pochopte IPackageReader a IPackageWriter
IPackageReader definuje metodu Read() pro čtení OPC balíčku; IPackageWriter definuje metodu Write() pro zápis. Knihovna poskytuje výchozí implementace založené na ZIP. Vlastní implementace lze dodat při načítání nebo ukládání do úložiště mimo souborový systém (např. cloudové blobky nebo paměťové buffery).
// 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: Zkontrolujte nepodporované části
Při načítání souboru XLSX PackageModel.UnsupportedParts uvádí části, které knihovna nezpracovává. Ty jsou zachovány, ale neinterpretovány. Přístup k PackageLoadContext během vlastního načítacího toku umožní prozkoumat 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.");Časté problémy a opravy
PackageStructureException je vyvolána i při TryRepairPackage = true. Některá strukturální selhání OPC jsou mimo automatickou opravu (např. úplně chybějící mapa typů obsahu). Ověřte, že soubor je platný ZIP pomocí unzip -t file.xlsx. Pokud je platný, může být šifrován — soubory chráněné heslem nejsou podporovány.
Workbook se načte, ale některý obsah chybí. Check LoadDiagnostics.Issues for DataLossRisk = true záznamy. To naznačuje části, které byly během opravy vypuštěny.
Custom IPackageReader není volána. Ujistěte se, že je použito přetížení konstruktoru, které přijímá vlastní čtečku. Ne všechny Workbook přetížení konstruktoru přijímají vlastní čtečku balíčku.
Často kladené otázky
Kdy bych měl implementovat IPackageReader nebo IPackageWriter?
Pouze když je vaše úložiště backendem, který není lokální souborový systém — například při načítání přímo ze streamu cloudového úložiště bez vytváření dočasného souboru.
Zůstávají nepodporované části v PackageModel při uložení zachovány?
Nestandardní části v UnsupportedParts nejsou zaručeny, že budou zapsány zpět. Pro zachování úplné věrnosti nestandardních částí během celého cyklu je potřeba po uložení souboru XLSX provést post-processing na úrovni ZIP.
Jaký je rozdíl mezi PackageStructureException a WorkbookLoadException?
PackageStructureException je selhání úrovně OPC/ZIP (chybějící typ obsahu, poškozený vztah). WorkbookLoadException je selhání vyšší úrovně při parsování obsahu XLSX XML.