Comment travailler avec le packaging OOXML dans .NET

Comment travailler avec le packaging OOXML dans .NET

Un fichier XLSX est une archive ZIP conforme à la convention Open Packaging Convention (OPC). Aspose.Cells FOSS for .NET expose la structure du package sous‑jacent via PackageModel, PackagePartDescriptor, IPackageReader et IPackageWriter. Il s’agit d’API de niveau infrastructure principalement utiles pour le diagnostic et les implémentations de stockage personnalisées. Installez avec dotnet add package Aspose.Cells_FOSS.

Guide étape par étape

Étape 1 : Installer le package

dotnet add package Aspose.Cells_FOSS

Étape 2 : Importer l’espace de noms

using Aspose.Cells_FOSS;

Étape 3 : Gérer PackageStructureException

PackageStructureException est levée lorsque le package XLSX possède une structure OPC invalide (par ex. relations requises manquantes). Attrapez‑la en même temps que WorkbookLoadException lors du chargement de fichiers provenant de sources non fiables.

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);
}

Étape 4 : Comprendre IPackageReader et IPackageWriter

IPackageReader définit une méthode Read() pour lire un package OPC ; IPackageWriter définit une méthode Write() pour en écrire une. La bibliothèque fournit des implémentations par défaut basées sur ZIP. Des implémentations personnalisées peuvent être fournies lors du chargement depuis ou de l’enregistrement vers un stockage non‑système de fichiers (par ex. des blobs cloud ou des tampons en mémoire).

// 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)");

Étape 5 : Vérifier les parties non prises en charge

Lors du chargement d’un fichier XLSX, PackageModel.UnsupportedParts répertorie les parties que la bibliothèque ne traite pas. Elles sont conservées mais non interprétées. Accédez à PackageLoadContext pendant un flux de chargement personnalisé pour inspecter le modèle.

// 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.");

Problèmes courants et solutions

PackageStructureException est levé même avec TryRepairPackage = true.
Certaines défaillances structurelles d’OPC dépassent la réparation automatique (p. ex. carte content-type complètement manquante). Vérifiez que le fichier est un ZIP valide avec unzip -t file.xlsx. S’il est valide, il peut être chiffré — les fichiers protégés par mot de passe ne sont pas pris en charge.

Workbook charge mais il manque du contenu.
Vérifiez LoadDiagnostics.Issues pour les entrées DataLossRisk = true. Celles‑ci indiquent les parties qui ont été supprimées lors de la réparation.

Custom IPackageReader n’est pas appelé.
Assurez-vous que la surcharge du constructeur qui accepte le lecteur personnalisé est utilisée. Toutes les surcharges du constructeur Workbook n’acceptent pas un lecteur de package personnalisé.

Foire aux questions

Quand devrais-je implémenter IPackageReader ou IPackageWriter ?

Uniquement lorsque votre backend de stockage n’est pas le système de fichiers local — par exemple, en chargeant directement depuis un flux de stockage cloud sans créer de fichier temporaire.

Les parties non prises en charge dans PackageModel sont‑elles conservées lors de l’enregistrement?

Les parties non standard dans UnsupportedParts ne sont pas garanties d’être réécrites. Pour assurer la fidélité en aller‑retour des parties non standard, post‑traitez le fichier XLSX enregistré au niveau du ZIP.

Quelle est la différence entre PackageStructureException et WorkbookLoadException ?

PackageStructureException est une défaillance au niveau OPC/ZIP (type de contenu manquant, relation cassée). WorkbookLoadException est une défaillance de niveau supérieur lors de l’analyse du contenu XML XLSX.

Voir aussi

 Français