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() | 将嵌入对象的原生数据保存到文件或流 |
OlePackage | OLE 包对象的文件名/显示名称 |
OleControl | 嵌入式 ActiveX 控件的基础表示 |
Forms2OleControl | Microsoft Forms 2.0 控件(复选框、文本框、组合框等) |
Forms2OleControlCollection | 子 Forms2OleControl 节点的集合(例如位于框架内) |
Forms2OleControlType | Forms 2.0 控件类型的枚举 |