Python读取Word文档中嵌入Excel文件的两种方法
本文详解在Python中读取Word文档内嵌Excel文件的两种方案。第一种利用Windows COM接口调用宏,依赖Office或WPS环境;第二种通过解析Word ZIP结构中的OLE二进制文件,结合olefile与openpyxl实现跨平台快速读取。
近日有开发者提出一个实际需求:

示例Word文档结构如下:

此类嵌入在Word中的文件,底层均属于OLE(对象链接与嵌入)文件。
接下来,我们假设需要提取每个嵌入Excel文件中名为“python”的工作表内的A1单元格数据。
通过Python调用COM接口宏实现
首先演示如何利用COM接口调用宏代码来完成此操作,完整代码如下:
from win32com import client as win32
import os
word = win32.Dispatch("Word.Application")
word.Visible = True
wdDoc = word.Documents.Open(os.path.abspath("test.docx"))
try:
for shape in wdDoc.InlineShapes:
if shape.Type != 1 or not shape.OLEFormat.ProgID.startswith("Excel.Sheet"):
# 要求形状类型为wdInlineShapeEmbeddedOLEObject,是Excel类型的OLE对象
continue
shape.OLEFormat.Open()
xlApp = win32.GetActiveObject('Excel.Application')
book = xlApp.Workbooks(1)
print([sht.Name for sht in book.Sheets])
print(book.Sheets("python").Range("A1").Value)
book.Close()
finally:
wdDoc.Close()
xlApp.Quit()
word.Quit()
运行结果如下:
['java', 'forever', 'python'] python ['java', 'forever', 'python'] python hello world ['java', 'forever', 'python'] python
需要注意的是,该方法仅在已安装Office或WPS办公软件的Windows环境下可用。
通过Python解析OLE文件实现
使用压缩软件查看可知,这三个Excel文件实际上是以OLE的bin文件形式存储的:

因此,我们只需理解并解析这些文件,即可还原出对应的Excel文件,随后直接使用openpyxl或pandas进行解析。
HY.Li大佬提供了相关参考代码:

这一思路与我的设想一致。此前我并未意识到可以使用olefile库直接解析此类文件,原本还打算自行实现解析逻辑。
参考上述代码,我的最终实现如下:
import olefile
from zipfile import ZipFile
from openpyxl import load_workbook
filename = "test.docx"
with ZipFile(filename, "r") as zip_file:
for name in zip_file.namelist():
if not name.startswith("word/embeddings/"):
continue
with zip_file.open(name) as f:
if not olefile.isOleFile(f):
continue
ole = olefile.OleFileIO(f)
try:
book = load_workbook(ole.openstream("package"))
print(book.sheetnames)
print(book["python"]["A1"].value)
except Exception as e:
print(name, "当前ole对象不是Excel文件:", e)
执行结果:
['java', 'forever', 'python'] python ['java', 'forever', 'python'] python hello world ['java', 'forever', 'python'] python
相比之下,这种方法具备跨平台特性,且执行速度更快。
以上就是关于Python读取Word文档中嵌入Excel文件方法的详细介绍,更多相关Python读取Word中的Excel嵌入文件内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













