OLE 对象和 ActiveX 控件

OLE 对象和 ActiveX 控件

OLE 对象和 ActiveX 控件

Aspose.Words FOSS for .NET 提供对嵌入式 OLE 对象和 Forms 2.0 ActiveX 控件的读取访问,途径是 OleFormat 入口点及其在 Aspose.Words.Drawing 和 Aspose.Words.Drawing.Ole 中的相关类。


访问嵌入式 OLE 对象数据

OleFormat 由嵌入的 Shape 暴露,并提供对嵌入对象的原始数据和元数据的访问。SuggestedFileName 和 SuggestedExtension 描述嵌入对象将以何种形式保存,ProgId 确定创建它的 OLE 服务器应用程序,IsLink 区分链接对象(SourceFullName/SourceItem 指向外部源)与完全嵌入的对象。GetOleEntry(oleEntryName) 从 OLE 复合文件结构读取特定命名流,GetRawData() 返回完整的原始对象数据,Save(fileName) / Save(stream) 将嵌入对象的本机数据写入磁盘或流——这对于在不打开原生应用程序的情况下提取原始嵌入文件(例如嵌入的电子表格或演示文稿)非常有用。通过 OleFormat.OlePackage 可达的 OlePackage 公开了作为 OLE 包嵌入的对象的 FileName 和 DisplayName。


使用 Forms 2.0 ActiveX 控件

当嵌入对象是 Microsoft Forms 2.0 ActiveX 控件(复选框、文本框、下拉框以及类似的交互式控件,而非嵌入文档)时,OleFormat.OleControl 返回一个 OleControl。检查其 IsForms2OleControl 属性,如果 true,则将其转换为 Forms2OleControl(所有 Forms 2.0 控件的抽象基类),以访问特定控件属性:Caption、Value、Enabled、Type(一个 Forms2OleControlType 值——CheckBox、Textbox、ComboBox、OptionButton、ListBox、CommandButton 等),以及视觉属性 ForeColor、BackColor、Width、Height。容器控件如框架通过 ChildNodes(一种 Forms2OleControlCollection)公开其嵌套控件。


技巧与最佳实践

  • 在假设嵌入对象数据本地存在之前,请检查 OleFormat.IsLink —— 链接对象通过 SourceFullName 引用外部文件,而不是嵌入其内容。
  • 在批量提取嵌入对象时,结合使用 SuggestedExtension 与 Save() 来重新构建合理的输出文件名。
  • 在转换为 Forms2OleControl 之前,请始终检查 OleControl.IsForms2OleControl —— 并非所有 OleControl 都是 Forms 2.0 控件。
  • Forms2OleControlCollection.Count 与通过 GetEnumerator() 的枚举使您能够遍历框架或多页容器控件内部的嵌套控件。

常见问题

问题原因修复
GetRawData() 返回意外/空数据对象是链接 (IsLink == true),而非嵌入式首先检查 IsLink;对链接对象解析 SourceFullName
InvalidCastException 正在将 OleControl 强制转换为 Forms2OleControl控件不是 Forms 2.0 控件在进行类型转换前检查 {IsForms2OleControl>
对命名流,GetOleEntry() 返回 null此对象的复合文件结构中不存在该流名称枚举实际的条目名称,而不是假设固定名称
在帧内部未找到嵌套控件仅检查了顶层的 OleControl,而未检查 ChildNodes在 Forms2OleControl.ChildNodes 中递归查找容器控件

FAQ

如何从 Word 文档中提取嵌入的 Excel 或 PowerPoint 对象?

访问形状的 OleFormat,然后调用 Save(fileName) 或 GetRawData() 以获取嵌入对象的原始字节;使用 SuggestedExtension 为输出文件适当地命名。

嵌入式 OLE 对象和 Forms 2.0 控件之间有什么区别?

嵌入式 OLE 对象(直接通过 OleFormat 访问)通常是另一个文档(电子表格、演示文稿);Forms 2.0 控件(OleFormat.OleControl → Forms2OleControl)是诸如复选框或文本框之类的交互式 UI 元素。

我如何判断 OLE 对象是链接的而不是嵌入的?

检查 OleFormat.IsLink —— 当 true、SourceFullName 和 SourceItem 描述外部来源而不是对象自身携带数据时。

我能读取复选框控件的标题或值吗?

是的——将 OleControl 强制转换为 Forms2OleControl(在确认 IsForms2OleControl 之后),并读取 Caption 和 Value。


API Reference 摘要

类 / 方法描述
OleFormat嵌入式 OLE 对象的数据和元数据的入口点
OleFormat.GetRawData()检索原始嵌入对象的字节
OleFormat.Save()将嵌入对象的原生数据保存到文件或流
OlePackageOLE 包对象的文件名/显示名称
OleControl嵌入式 ActiveX 控件的基础表示
Forms2OleControlMicrosoft Forms 2.0 控件(复选框、文本框、组合框等)
Forms2OleControlCollection子 Forms2OleControl 节点的集合(例如位于框架内)
Forms2OleControlTypeForms 2.0 控件类型的枚举

另请参阅

 中文