Как работать с упаковкой OOXML в .NET

Как работать с упаковкой OOXML в .NET

Файл XLSX — это ZIP‑архив, соответствующий Open Packaging Convention (OPC). Aspose.Cells FOSS for .NET предоставляет доступ к внутренней структуре пакета через PackageModel, PackagePartDescriptor, IPackageReader и IPackageWriter. Это API инфраструктурного уровня, в первую очередь полезные для диагностики и реализации пользовательского хранилища. Установите с помощью dotnet add package Aspose.Cells_FOSS.

Пошаговое руководство

Шаг 1: Установить пакет

dotnet add package Aspose.Cells_FOSS

Шаг 2: Импортировать пространство имён

using Aspose.Cells_FOSS;

Шаг 3: Обработка PackageStructureException

PackageStructureException выбрасывается, когда пакет XLSX имеет недопустимую структуру OPC (например, отсутствуют обязательные отношения). Обрабатывайте его вместе с WorkbookLoadException при загрузке файлов из ненадёжных источников.

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

Шаг 4: Понимание IPackageReader и IPackageWriter

IPackageReader определяет Read() метод для чтения OPC‑пакета; IPackageWriter определяет Write() метод для записи. Библиотека предоставляет реализации по умолчанию, основанные на ZIP. Пользовательские реализации могут быть предоставлены при загрузке из или сохранении в хранилище, не являющееся файловой системой (например, облачные блобы или буферы в памяти).

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

Шаг 5: Проверка неподдерживаемых частей

При загрузке файла XLSX PackageModel.UnsupportedParts перечисляет части, которые библиотека не обрабатывает. Они сохраняются, но не интерпретируются. Получите доступ к PackageLoadContext во время пользовательского процесса загрузки, чтобы изучить модель.

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

Распространённые проблемы и решения

PackageStructureException генерируется даже при TryRepairPackage = true.
Некоторые структурные ошибки OPC выходят за пределы автоматического исправления (например, полностью отсутствующая карта content-type). Проверьте, что файл является корректным ZIP с помощью unzip -t file.xlsx. Если файл корректен, он может быть зашифрован — файлы, защищённые паролем, не поддерживаются.

Workbook загружается, но часть содержимого отсутствует. Проверьте LoadDiagnostics.Issues на наличие записей DataLossRisk = true. Они указывают на части, которые были удалены во время восстановления.

Custom IPackageReader не вызывается. Убедитесь, что используется перегрузка конструктора, принимающая пользовательский читатель. Не все Workbook перегрузки конструктора принимают пользовательский пакетный читатель.

Часто задаваемые вопросы

Когда следует реализовывать IPackageReader или IPackageWriter?

Только когда ваш бэкенд хранилища не является локальной файловой системой — например, загрузка напрямую из облачного потока без создания временного файла.

Сохраняются ли неподдерживаемые части в PackageModel при сохранении?

Нестандартные части в UnsupportedParts не гарантируются к записи обратно. Для обеспечения точности обратного преобразования нестандартных частей выполните постобработку сохранённого XLSX на уровне ZIP.

В чём разница между PackageStructureException и WorkbookLoadException?

PackageStructureException — это ошибка уровня OPC/ZIP (отсутствует тип содержимого, нарушена связь). WorkbookLoadException — это ошибка более высокого уровня при разборе XML‑содержимого XLSX.

См. также

 Русский