Python读取Word文档中的Excel嵌入文件的方法详解

  • Post category:Python

首先,需要安装python-docx库,可以使用pip install python-docx命令进行安装。

其次,使用以下代码片段可以读取Word文档中的Excel嵌入文件:

from docx import Document
import zipfile
import shutil
import os

docx_path = 'example.docx'
docx_dir = 'docx_extract'

with zipfile.ZipFile(docx_path) as z:
    for info in z.infolist():
        if info.filename.startswith('word/embeddings/'):
            _, _, name = info.filename.split('/')
            with z.open(info) as f:
                with open(os.path.join(docx_dir, name), 'wb') as out:
                    out.write(f.read())

for root, dirs, files in os.walk(docx_dir):
    for file in files:
        if file.endswith('.xlsx'):
            print(os.path.join(root, file))

代码中,我们首先打开文档,并且用ZipFile读取文档。然后遍历其中所有的文件,找到嵌入的Excel文件。两个嵌入的文件,它们的路径分别是word/embeddings/Microsoft_Excel_Worksheet1.xlsx和word/embeddings/Microsoft_Excel_Worksheet2.xlsx。这两个文件的路径可以直接在Word文档中的XML中找到。我们将这些文件解压到一个临时文件夹,并且找到其中后缀是.xlsx的文件进行后续处理。

下面是一个示例:

假设我们有一个名为example.docx的Word文档,其中包含两个Excel嵌入文件。我们可以通过修改上面的代码,找到并读取这些文件,从而对这些文件进行操作,这里我们将其中一个文件的内容读取,并打印输出。

from docx import Document
import zipfile
import shutil
import os

import openpyxl

docx_path = 'example.docx'
docx_dir = 'docx_extract'

with zipfile.ZipFile(docx_path) as z:
    for info in z.infolist():
        if info.filename.startswith('word/embeddings/'):
            _, _, name = info.filename.split('/')
            with z.open(info) as f:
                with open(os.path.join(docx_dir, name), 'wb') as out:
                    out.write(f.read())

for root, dirs, files in os.walk(docx_dir):
    for file in files:
        if file.endswith('.xlsx'):
            wb = openpyxl.load_workbook(os.path.join(root, file))
            ws = wb.active
            print(ws['A1'].value)

代码中,我们使用了openpyxl库来读取Excel文件的内容。我们通过遍历之前提取出来的所有xlsx文件,使用load_workbook()方法读取Excel文件。然后通过workbook.active获取工作簿,以及worksheet[‘A1’].value获取单元格A1的值,并打印输出。

参考资料:
1. python-docx: https://python-docx.readthedocs.io/en/latest/
2. openpyxl: https://openpyxl.readthedocs.io/en/stable/