暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Python轻松读取Word文档里的Excel附件

alitrack 2022-12-16
1687

群里有人提出这么一个需求:每天都会传过来一份 Word 文档,里面有多个 Excel 附件,需要把 Excel 内容读取出来。

第一反应是使用python-docx[1], 经测试,不支持附件提取。 

然后想 docx 本质就是一个 zip 格式的压缩包,直接当做 zip 包提取吧。


红色圈住的部分就是今天的主角,三个 ole 附件。

解压缩

这样问题就变成了从 zip 里提取三个附件,代码如下:

#zipfile为python自带包
from zipfile import ZipFile
with ZipFile("test.docx""r"as zip:
    for entry in zip.infolist():
        if not entry.filename.startswith("word/embeddings/"):
            continue
        zip.extract(entry.filename)

得到三个 ole 文件。

这段代码等价于下面的 unzip 命令行

unzip  test.docx word/embeddings/*
#返回
Archive:  test.docx
   creating: word/embeddings/
  inflating: word/embeddings/oleObject1.bin
  inflating: word/embeddings/oleObject2.bin
  inflating: word/embeddings/oleObject3.bin

Microsoft OLE2 文件分析与提取

分析

文件提取好后, 使用 file 程序分析,得到

file word/embeddings/oleObject1.bin
#返回
word/embeddings/oleObject1.bin: Composite Document File V2 Document, Cannot read section info

这是一个 Microsoft OLE2 文件,不是我们想要的 Excel,需要进一步分析提取,有请olefile
登场。

olefile[2](原名 OleFileIO_PL)是一个 Python 包,用于解析、读写 Microsoft OLE2 文件(也称为 Structured Storage、Compound File Binary Format 或 Compound Document File Format),例如 Microsoft Office 97-2003 文档,MS Office 中的 vbaProject.bin 2007+ 文件、Image Composer 和 FlashPix 文件、Outlook MSG 文件、StickyNotes、多种 Microscopy 文件格式、McAfee 防病毒隔离文件等。

安装

pip install olefile

提取

import olefile
f = "word/embeddings/oleObject1.bin"
if olefile.isOleFile(f):
    with olefile.OleFileIO(f) as ole:
        print(ole.listdir())
    #返回[['\x01Ole'], ['\x03ObjInfo'], ['package']]
    # 经分析只有package里放着我们需要的信息
        bin_data = ole.openstream("package").read()
        fn = f.replace("word/embeddings/","")
        with open(fn, "wb"as output_file:
            output_file.write(bin_data)

再次使用 file 分析

file oleObject1.bin
#返回
oleObject1.bin: Microsoft Excel 2007+

是我们想要的 Excel 文件。

完整代码如下

import olefile
from zipfile import ZipFile
def get_ole(filename):
    with ZipFile(filename, "r"as zip:
        for entry in zip.infolist():
            if not entry.filename.startswith("word/embeddings/"):
                continue
            with zip.open(entry.filename) as f:
                if not olefile.isOleFile(f):
                    continue
                with olefile.OleFileIO(f) as ole:
                    bin_data = ole.openstream("package").read()
                    fn = entry.filename.replace("word/embeddings/","")
           #如果想直接读取,可以把下面两行代码换成需要的代码。
                    with open(fn, "wb"as output_file:
                        output_file.write(bin_data)
if __name__ == '__main__':
    get_ole("/Users/steven/temp/test.docx")

使用正确的后缀保存附件

我想保存的时候使用正确后缀,怎么办?使用filetype[3]获得正确的后缀。

安装

pip install git+https://github.com/h2non/filetype.py

最新版本支持 Office 文档识别

获取后缀

import filetype
ext = filetype.guess_extension("oleObject1.bin")
print(ext)
#返回
xlsx

如果碰到 filetype 无法识别的,就需要考虑 python-magic 或者 file 了。

python-magic[4]是 libmagic 文件类型标识库的 Python 接口。libmagic
通过根据预定义的文件类型列表检查文件类型的头文件来识别文件类型。Unix 命令文件file
就是依赖该库来实现文件类型判断。

安装

Windows 推荐安装方法
pip install python-magic-bin
Linux 和macOS还需要额外安装libmagic

获取后缀

import magic
m = magic.Magic(extension=True)
ext = m.from_file("oleObject1.bin")
print(ext)
#返回
xlsx

正确的文件名

附件的原始名字是以图片的形式存在,emf 格式, 如果需要获取原始文件名字,需要 OCR 了, 同时还需要找到对应关系,这里就不展开了。

该方法稍作修改,同样对Excel和PPT里的附件有效。

参考资料

[1]

python-docx: https://github.com/python-openxml/python-docx

[2]

olefile: https://github.com/decalage2/olefile

[3]

filetype: https://github.com/h2non/filetype.py

[4]

python-magic: https://github.com/ahupp/python-magic


电子表格 python
文章转载自 alitrack,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

玻璃钢生产厂家南宁玻璃钢羊雕塑批发玻璃钢座椅雕塑生产厂家烤漆玻璃钢雕塑加工肇庆玻璃钢动物雕塑商场春季美陈贴纸河池市玻璃钢雕塑定制玻璃钢雕塑设计制作公司沈阳景区玻璃钢雕塑制作深圳中庭商场美陈厂家供应定西玻璃钢植物雕塑制作玻璃钢佛像雕塑排行榜太原玻璃钢雕塑销售厂家玻璃钢罗马柱雕塑报价明细表方形玻璃钢花盆厂家福清玻璃钢雕塑哪里好张掖景区玻璃钢雕塑郑州大型玻璃钢仿铜雕塑济南玻璃钢艺术雕塑厂家茂名玻璃钢景观雕塑造型精美云南水果玻璃钢雕塑优势广东大型商场美陈供应商玻璃钢雕塑一般寿命东莞欧式玻璃钢花盆云南玻璃钢雕塑造型厂家哪里有商场儿童节美陈装饰商场美陈展示平面图玻璃钢抽象不锈钢雕塑生产贵州大型玻璃钢雕塑订做价格玻璃钢武打雕塑雪人雕塑玻璃钢模具开模视频香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化