使用 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.Relationships | OPC 关系条目 |
PackageModel.UnsupportedParts | 库未处理的部件 |
PackagePartDescriptor.PartUri | 部件的 OPC URI |
PackagePartDescriptor.ContentType | 部件的 MIME 内容类型 |
PackagePartDescriptor.Category | 逻辑类别(工作表、样式等) |
PackageStructureException | 在 OPC 结构违规时抛出 |