我的编程空间,编程开发者的网络收藏夹
学习永远不晚

利用Python实现读取Word文档里的Excel附件

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

利用Python实现读取Word文档里的Excel附件

群里有人提出这么一个需求:每天都会传过来一份 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里的附件有效。

到此这篇关于利用Python实现读取Word文档里的Excel附件的文章就介绍到这了,更多相关Python读取Word中Excel附件内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

利用Python实现读取Word文档里的Excel附件

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

利用Python实现读取Word文档里的Excel附件

这篇文章主要为大家详细介绍了如何利用Python实现读取Word文档里的Excel附件,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
2022-12-16

利用POI读取word、Excel文件的最佳实践教程

前言POI是 Apache 旗下一款读写微软家文档声名显赫的类库。应该很多人在做报表的导出,或者创建 word 文档以及读取之类的都是用过 POI。POI 也的确对于这些操作带来很大的便利性。我最近做的一个工具就是读取计算机中的 word
2023-05-30

怎么利用Python实现读取Word表格计算汇总并写入Excel

这篇文章将为大家详细讲解有关怎么利用Python实现读取Word表格计算汇总并写入Excel,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。前言快过年了,又到了公司年底评级的时候了。今年的评级
2023-06-28

利用python实现ftp的文件读写

ftp登陆连接from ftplib import FTP #加载ftp模块ftp=FTP() #设置变量ftp.set_debuglevel(2)
2023-01-31

利用pandas读取Excel文件,轻松实现数据导入与分析

利用pandas读取Excel文件,轻松实现数据导入与分析pandas是Python中用于数据分析的强大工具,它可以对各种格式的数据进行灵活高效的处理。在数据分析中,Excel是一种常用的数据格式,pandas提供了方便的接口,使得我们可
利用pandas读取Excel文件,轻松实现数据导入与分析
2024-01-19

TXT文件的内容如何利用Java实现读取

本篇文章为大家展示了TXT文件的内容如何利用Java实现读取,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。Java读取txt文件内容。可以作如下理解:首先获得一个文件句柄。File file = n
2023-05-31

python使用numpy按一定格式读取bin文件的实现

目录使用numpy按一定格式读取bin文件这里重点介绍fromfilepython读取bin文件并下发串口总结使用numpy按一定格式读取bin文件python环境下,如何使用numpy像matlab一样按一定格式读取bin文件?bin
2023-05-12

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录