使用 OOXML 包装

使用 OOXML 包装

XLSX 文件是一个开放包装约定(OPC)ZIP归档。Aspose.Cells针对.NET的开源软件公开了底层包层,通过IPackageReader、IPackageWriter和PackageModel对象图。这些是用于诊断和工具的低层 API——大多数应用只使用高级的Workbook类。


包模型

PackageModel 表示 XLSX 归档的逻辑内容。它公开了三个集合:Parts(所有内容部件),Relationships(OPC 关系条目),以及 UnsupportedParts(文件中存在但库不处理的部件)。每个部件由一个 PackagePartDescriptor 描述,包含 PartUri、ContentType 和 Category。

using Aspose.Cells_FOSS;

// PackageModel is accessed via PackageLoadContext during custom load flows
// The following illustrates the object structure
// var context = new PackageLoadContext(workbook, packageModel);
// var model = context.Package;
// foreach (var part in model.Parts)
// {
//     Console.WriteLine($"URI={part.PartUri}, Type={part.ContentType}");
// }
// Console.WriteLine("Unsupported parts: " + model.UnsupportedParts.Count);

Note: PackageModel 在加载 XLSX 文件时内部填充。直接实例化不属于标准的高级工作流。


IPackageReader 和 IPackageWriter

IPackageReader 定义了一个用于读取 OPC 包的单一 Read() 方法。IPackageWriter 定义了一个用于写入 OPC 包的单一 Write() 方法。这些接口由库内部基于 ZIP 的读取器/写入器实现,并且可以通过自定义实现提供,以用于内存或云存储场景。

// Signature reference — not a complete runnable example
// public interface IPackageReader { void Read(...); }
// public interface IPackageWriter { void Write(...); }

PackageStructureException

当 XLSX 包结构根本无效时会抛出 PackageStructureException——例如缺少必需的 OPC 关系时。它继承自通用异常层次结构,并携带描述被违反的结构不变式的消息。

using Aspose.Cells_FOSS;

var opts = new LoadOptions { TryRepairPackage = true };

try
{
    var wb = new Workbook("bad.xlsx", opts);
}
catch (PackageStructureException ex)
{
    Console.WriteLine("OPC structure error: " + ex.Message);
}
catch (WorkbookLoadException ex)
{
    Console.WriteLine("Load error: " + ex.Message);
}

提示和最佳实践

  • 使用 PackageModel.UnsupportedParts 可发现可能在往返过程中被静默丢弃的非标准部件。
  • 从不受信任的来源加载文件时,除了捕获 WorkbookLoadException 外,还应捕获 PackageStructureException。
  • IPackageReader/IPackageWriter 接口是扩展点;仅在需要自定义存储(例如从云 Blob 加载而无需本地文件)时实现它们。
  • 对于大多数诊断而言,LoadDiagnostics(可通过 Workbook.LoadDiagnostics 访问)已足够——很少需要降级到包层。

常见问题

问题原因修复
加载时的 PackageStructureException缺少必需的 OPC 关系在 LoadOptions 中设置 TryRepairPackage = true;加载后检查 LoadDiagnostics.Issues
UnsupportedParts 非空文件包含非标准扩展名如果这些部分在加载时存在,保存时会原样保留
自定义 IPackageReader 未被调用传递给了错误的构造函数重载确保使用 LoadOptions 或接受自定义读取器的构造函数重载

FAQ

在普通电子表格工作中,我需要使用 IPackageReader/IPackageWriter 吗?

不。这些接口是用于高级场景的扩展点。所有标准的读写操作都直接通过 Workbook 进行。

在保存时,未受支持的部分会被保留吗?

在 PackageModel.UnsupportedParts 中列出的部分不会被处理,可能不会写回。如果需要对非标准部分进行往返保真,请使用 zip 级别的后处理步骤。

PackageStructureException 与 WorkbookLoadException 有何区别?

PackageStructureException 表示 OPC/ZIP 级别的失败(缺少内容类型,关系损坏)。WorkbookLoadException 表示 XLSX 内容中更高级别的解析或语义失败。


API Reference 摘要

类 / 接口描述
IPackageReader用于读取 OPC 包的接口(Read 方法)
IPackageWriter用于写入 OPC 包的接口(Write 方法)
PackageLoadContext将 Workbook 绑定到其 PackageModel
PackageLoadContext.Package返回 PackageModel
PackageModel.Parts包中的所有内容部件
PackageModel.RelationshipsOPC 关系条目
PackageModel.UnsupportedParts库未处理的部件
PackagePartDescriptor.PartUri部件的 OPC URI
PackagePartDescriptor.ContentType部件的 MIME 内容类型
PackagePartDescriptor.Category逻辑类别(工作表、样式等)
PackageStructureException在 OPC 结构违规时抛出

另请参阅

 中文