Python读取Word文档中的Excel嵌入文件的方法详解
小小明-代码实体 人气:0今天群友提出一个问题:
给出Word示例如下:
对于这种嵌入文件在Word中都属于ole文件。
下面我们假设需要读取每个嵌入的Excel文件中的python工作表中的A1单元格。
python调用宏实现
首先我们看看如何调用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
相对来说,此方法跨平台,速度快。
加载全部内容