在有些时候是存在从Excel文件中提取嵌入的图像,比如jpeg、png类型的图像,对于Excel这种文件来说存在两种格式,一种是xlsx,另一种是xls格式,第一种非常好解析出里面嵌入的图像数据,而后者xls格式这种是微软旧版的格式,这种格式解析起来极其繁琐,而且网络上并非有现存的教程教你一步步解析,因此我开发了一款工具,能够高效提取xls中的图像文件。
点击空白处退出提示
在有些时候是存在从Excel文件中提取嵌入的图像,比如jpeg、png类型的图像,对于Excel这种文件来说存在两种格式,一种是xlsx,另一种是xls格式,第一种非常好解析出里面嵌入的图像数据,而后者xls格式这种是微软旧版的格式,这种格式解析起来极其繁琐,而且网络上并非有现存的教程教你一步步解析,因此我开发了一款工具,能够高效提取xls中的图像文件。
本项目已经开源至Github社区,并专门写过一些文档在国内社区,功能主要为:
1. 能够解析xls文件流,找到图像数据所在位置并提取出保存。
2. 弥补了C/C++开源库在这方面的空白。
一、获取 WorkBook 流
XLS 文件采用复合文档格式存储,图像数据位于 WorkBook 流中。借助微软开源的 compoundfilereader 库,可以高效地从 XLS 文件中解析出 WorkBook 流,为后续处理奠定基础。
二、定位 MsoDrawingGroup 记录
WorkBook 流由多个 BIFF8 结构组成,每个结构包含记录类型、大小和数据。图片数据存储在类型为MsoDrawingGroup的记录中。通过遍历所有 BIFF8 结构,即可获取全部 MsoDrawingGroup 数据块。
由于单个 BIFF8 存储容量有限,当图像数据较大时会被分割存储。被分割的数据块除第一个外,后续均以recordType = BIFF8_CONTINUE作为标识,这为数据重组提供了可靠依据。
三、图像数据提取
MsoDrawingGroup 记录中混杂了图形布局信息,不能直接写入文件。通过分析二进制数据发现,图像数据在其中呈连续完整存储。基于此,采用文件签名顺序分割算法进行提取:
PNG格式处理:遍历数据流,匹配 PNG 文件头签名89 50 4E 47 0D 0A 1A 0A。该签名辨识度高,误判率极低。定位文件头后,查找 IEND 结束块确定数据边界。
JPEG格式处理:查找 JPEG 起始标识(JFIF/Exif头部)。结束标识0xFF 0xD9可能出现在图像内容中,若顺序扫描易被干扰。为此采用逆向回溯策略:当定位到下一文件头时,向前回溯查找上一图片的真实结束符,确保分割准确。
该方案无需完全解析复杂文档结构,即可高效、准确地提取 XLS 中的 PNG 和 JPEG 图像。




评论