C#学习调用OpenMcdf模块解析ole数据的基本用法(1)

  上一篇文章介绍基于openxml的嵌入对象类EmbeddedObjectPart将word文档内的OLE对象提取出来,保存为bin文件。通过百度相关文章及咨询大模型,选用开源模块OpenMcdf解析OLE文件,OpenMCDF是一个.NET开源库,专门用于读写OLE结构化存储文件(复合文档),支持解析和操作.doc、.xls等传统Office文件格式,提供对存储、流和属性的完全访问,无需依赖Microsoft Office,该库轻量高效,常用于文档分析、元数据提取和文件修复场景。
  最开始是通过Nuget包管理器搜索并安装OpenMcdf及OpenMcdf.Extensions包,但用起来感觉不方便,且参考文献1中主要提到的部分类的用法也跟包中对应类不一样,于是下载参考文献1中的源码在本地编译,然后新建Winform项目,添加对OpenMcdf解决方案中的OpenMcdf项目和OpenMcdf.Ole项目的引用。

  参考文献6详细介绍了复合文件CFB的存储结构,在OpenMcdf模块中,RootStorage类是复合文档的根存储容器,其下级结构分为Storage、Stream两种类型,Storage类型数据类似文件夹的容器结构,可嵌套包含其他Storage和Stream数据,用于组织文档的逻辑分区,Stream类型数据存储数据的二进制流,类似文件系统中的文件,包含具体内容数据。
  OpenMcdf模块的EntryInfo类用于描述OLE复合文档中的条目(存储Storage或流Stream)的元数据信息。它不直接存储数据,而是提供条目的属性描述,其Type属性(EntryType类型)标识条目类型(Storage或Stream),Name属性存储条目名称。
  通过调用RootStorage类的EnumerateEntries函数获取下级条目信息,示例代码如下所示:

csharp 复制代码
RootStorage rs = RootStorage.Open(txtPath.Text, FileMode.Open);

IEnumerable<EntryInfo> entryInfos = rs.EnumerateEntries();
foreach (EntryInfo entryInfo in entryInfos)
{
    txtFileInfo.Text += $"Name:{entryInfo.Name},Type:{entryInfo.Type}\r\n";
}



  通过查阅资料,通常名称为"\u0003ObjInfo"保存的是嵌入对象信息,为ODT结构,名称为"\u0001Ole10Native"的条目保存的是OLE对象的原始数据。
  通过调用RootStorage的TryOpenStream函数或OpenStream函数,传入条目名称可以获取条目的数据流对象(CfbStream类),然后通过从流中读取数据进一步分析数据格式。

参考文献:

1https://github.com/ironfede/openmcdf

2https://blog.csdn.net/gitblog_00043/article/details/142279144

3https://learn.microsoft.com/en-us/openspecs/office_file_formats/ms-doc/13ba10a8-d8b2-433b-bf3b-ec238dc8f9ce?redirectedfrom=MSDN

4https://wenku.csdn.net/answer/13y75gvusr

5https://wenku.csdn.net/answer/o7oarkndk8

6https://www.cnblogs.com/dengchj/p/15267390.html

相关推荐
下页、再停留2 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
波力海苔夹心脆6757 小时前
VisionMaster 两级位置修正实战:塑料外壳与金属件装配角度检测
经验分享·计算机视觉·c#·visionmaster·海康机器人·位置修正
小羊没烦恼!9 小时前
C#综合揭秘——Entity Framework 并发处理详解
java·开发语言·前端·javascript·数据库·mysql·c#
淡海水10 小时前
05-02-源码-Boehm GC标记阶段
算法·unity·c#·游戏引擎·gc
信可维10 小时前
AI 读 Word 表格总读错?先查合并单元格和表头这 3 处
开发语言·人工智能·c#·word·软件工程
半摆烂日常12 小时前
手机表单的左滑操作:触摸事件的处理细节
大数据·开发语言·人工智能·智能手机·https·c#
绛橘色的日落(。・∀・)ノ13 小时前
C#学习笔记
笔记·学习·c#
asdzx6713 小时前
C# 将 HTML 转换为 PDF:基于 Chrome 的转换方案
pdf·c#·html
1-1=014 小时前
.NET 实现后台任务
c#·.net·.netcore·quartz·hangfire
步步为营DotNet14 小时前
从分代预算到 DATAS:.NET GC 调优到底在调什么
c#·.net·内存管理·gc·datas