Como trabalhar com empacotamento OOXML no .NET
Um arquivo XLSX é um arquivo ZIP que segue a Open Packaging Convention (OPC). Aspose.Cells FOSS for .NET expõe a estrutura de pacote subjacente através de PackageModel, PackagePartDescriptor, IPackageReader e IPackageWriter. Estas são APIs de nível de infraestrutura principalmente úteis para diagnósticos e implementações de armazenamento personalizadas. Instale com dotnet add package Aspose.Cells_FOSS.
Guia passo a passo
Etapa 1: Instalar o Pacote
dotnet add package Aspose.Cells_FOSSEtapa 2: Importar o Namespace
using Aspose.Cells_FOSS;Etapa 3: Tratar PackageStructureException
PackageStructureException é lançada quando o pacote XLSX tem uma estrutura OPC inválida (por exemplo, relacionamentos obrigatórios ausentes). Capture-a juntamente com WorkbookLoadException ao carregar arquivos de fontes não confiáveis.
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);
}Passo 4: Entender IPackageReader e IPackageWriter
IPackageReader define um método Read() para ler um pacote OPC; IPackageWriter define um método Write() para gravá‑lo. A biblioteca fornece implementações padrão baseadas em ZIP. Implementações personalizadas podem ser fornecidas ao carregar ou salvar em armazenamento que não seja de sistema de arquivos (por exemplo, blobs na nuvem ou buffers em memória).
// 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)");Etapa 5: Verificar partes não suportadas
Ao carregar um arquivo XLSX, PackageModel.UnsupportedParts lista partes que a biblioteca não processa. Elas são preservadas, mas não interpretadas. Acesse PackageLoadContext durante um fluxo de carregamento personalizado para inspecionar o modelo.
// 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.");Problemas Comuns e Soluções
PackageStructureException é lançada mesmo com TryRepairPackage = true.
Algumas falhas estruturais do OPC estão além do reparo automático (por exemplo, mapa de tipo de conteúdo completamente ausente). Verifique se o arquivo é um ZIP válido com unzip -t file.xlsx. Se for válido, pode estar criptografado — arquivos protegidos por senha não são suportados.
Workbook carrega mas algum conteúdo está faltando.
Verifique LoadDiagnostics.Issues para entradas DataLossRisk = true. Estas indicam partes que foram descartadas durante o reparo.
Custom IPackageReader não está sendo chamado.
Garanta que a sobrecarga do construtor que aceita o leitor personalizado seja usada. Nem todas as sobrecargas do construtor Workbook aceitam um leitor de pacote personalizado.
Perguntas Frequentes
Quando devo implementar IPackageReader ou IPackageWriter?
Somente quando o seu backend de armazenamento não for o sistema de arquivos local — por exemplo, carregando diretamente de um fluxo de armazenamento em nuvem sem criar um arquivo temporário.
As partes não suportadas no PackageModel são preservadas ao salvar?
Partes não padrão em UnsupportedParts não têm garantia de serem gravadas de volta. Para fidelidade de ida e volta das partes não padrão, pós-processe o XLSX salvo no nível ZIP.
Qual é a diferença entre PackageStructureException e WorkbookLoadException?
PackageStructureException é uma falha em nível OPC/ZIP (tipo de conteúdo ausente, relacionamento quebrado). WorkbookLoadException é uma falha em nível superior ao analisar o conteúdo XML do XLSX.