python-docx读取模板文档并填充数据

 更新时间:2024年11月12日 09:56:43   作者:十连满潜  
python-docx 是开源的一个 Python 库,用于读取、创建和更新Microsoft Word 2007+(.docx)文件,下面我们就来看看如何利用python-docx读取模板文档并填充数据吧

简介

python-docx 是开源的一个 Python 库,用于读取、创建和更新Microsoft Word 2007+(.docx)文件。目前最新版本是1.1.2。

官方文档地址:python-docx.readthedocs.io/en/latest/

其开源仓库地址:github.com/python-openxml/python-docx

准备docx文档

docx 文档可以用 office 打开,也可以用 WPS,这边截图使用的是 WPS,因为里面邮件合并部分 “插入合并域/Next域” 自带的小书名号非常独特,这个符号的正式名称是角引号,主要用于法语、俄语、西班牙语等欧洲语言中,中文语境里使用较少,很适合作为后面遍历行段内容替换字符串时的标识符。

在 “插入域” 弹窗的选项中选择域名为 “唯一标识符” 的选项插入,先前鼠标定位的位置就会添加上这个小书名号包裹的 “唯一标识符”。

只要插入了一个标识符,剩下的就可以复制粘贴了。角引号里面的内容也可以改成自己想要的字段名称,中英文不限。

像下面的示例表格,便是直接从前面这个唯一标识符复制过来的。复制时记得把角引号包裹住了。WPS里面鼠标点击标识符时会自动出现截图中的深色区域,很方便检查。

不过这个邮件合并域功能目前我只在 WPS 的 “引用” 模块里有找到,在 office 的 Word 里没有找到对应的地方。虽然 “插入” 里可以选择 “域”,但操作起来容易出错,我自己就没看懂应该选哪个去插入……

python代码

前面特地添加一个表格做示例,主要是因为获取文档内容时,表格需要单独的遍历。

from docx import Document

def merge_docx(doc, data):
    '''
    替换文档里各个占位符,替换后保存
    :param data: 数据data = { '这句话的英文': 'Hello World!','这句话的加粗版本': 'Hello World!' }
    :return:
    '''
    # 遍历文档中的所有段落
    for para in doc.paragraphs:
        # 替换每个自定义合并域
        for key, value in data.items():
            if f"«{key}»" in para.text:
                para.text = para.text.replace(f"«{key}»", value)

    # 遍历文档中的所有表格,再遍历单元格内段落
    for table in doc.tables:
        for row in table.rows:
            for cell in row.cells:
                cell_text = cell.paragraphs[0].text
                if cell_text[1:-1] in data.keys():
                    key = cell_text[1:-1]
                    val = data[key] # cell.text.replace(f"«{key}»", data[key])
                    pa = cell.paragraphs[0]
                    pa.clear()
                    r = pa.add_run(val)
                    r.bold = True # 加粗需要在run级别设置


data={ '这句话的英文': 'Hello World!','这句话的加粗版本': 'Hello World!' }
doc=Document('test.docx')
merge_docx(doc,data)
doc.save('result.docx')

执行完毕,文档成功生成,里面的内容也成功替换,如下图:

docx转pdf

有时候,文档需要转换成 PDF 格式,python-docx 缺少相应的工具,因此只能寻求其他工具,比如 win32com,恰好,win32com 可以调用到办公软件里的 wdExportFormatPDF 方法,用来将文件导出成pdf。

这个方法在 office 和 WPS 里都有存在,WPS 的 WebOffice 文档 可以做参考。

Office 官方的文档也可以看看。

image.png

两个软件的可用方法还是有区别的,只是恰好在导出成PDF这方面是一致。体现在代码中,最主要的便只剩下的调用的底层办公软件对象。

import win32com, pythoncom
from win32com.client import constants, gencache

def word2pdf(word_path):
    pdf_path = word_path.replace(".docx", ".pdf")
    pythoncom.CoInitialize()
    wc = win32com.client.constants
    # 下面这个地方,WPS 就用 kwps.application ,Office就用 word.application
    wps = gencache.EnsureDispatch("kwps.application")
    doc = wps.Documents.Open(word_path, ReadOnly=1)
    doc.SaveAs2(FileName=pdf_path, FileFormat=wc.wdExportFormatPDF)
    wps.Documents.Close(wc.wdDoNotSaveChanges)
    wps.Documents.Close()
    wps.Quit()

word2pdf('result.docx')

执行完毕,文件成功导出。任务完成。

到此这篇关于python-docx读取模板文档并填充数据的文章就介绍到这了,更多相关python-docx读取模板文档内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Python绘制美观动态圆环图、饼图

    基于Python绘制美观动态圆环图、饼图

    这篇文章主要介绍了基于Python制作美观动态圆环图、饼图,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • Python图像处理之Hough圆形检测

    Python图像处理之Hough圆形检测

    霍夫变换是一种特征检测(feature extraction),被广泛应用在图像分析,本文将利用Hough变换实现圆形检测,感兴趣的小伙伴可以跟随小编一起了解一下
    2023-07-07
  • Python设计模式之桥接模式原理与用法实例分析

    Python设计模式之桥接模式原理与用法实例分析

    这篇文章主要介绍了Python设计模式之桥接模式原理与用法,结合具体实例形式分析了Python桥接模式的相关概念、原理、定义及使用方法,需要的朋友可以参考下
    2019-01-01
  • python3的数据类型及数据类型转换实例详解

    python3的数据类型及数据类型转换实例详解

    在本文里小编给大家分享的是关于python3的数据类型及数据类型转换以及相关实例内容,有兴趣的朋友们可以学习下。
    2019-08-08
  • python通过pil为png图片填充上背景颜色的方法

    python通过pil为png图片填充上背景颜色的方法

    这篇文章主要介绍了python通过pil为png图片填充上背景颜色的方法,实例分析了Python使用pil模块操作png图片的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • 详细聊聊为什么Python中0.2+0.1不等于0.3

    详细聊聊为什么Python中0.2+0.1不等于0.3

    最近在学习过程中发现在计算机JS时发现了一个非常有意思事,0.1+0.2的结果不是0.3,而是0.30000000000000004,下面这篇文章主要给大家介绍了关于为什么Python中0.2+0.1不等于0.3的相关资料,需要的朋友可以参考下
    2022-12-12
  • Flask中Cookie和Session理解与作用介绍

    Flask中Cookie和Session理解与作用介绍

    Flask是一个使用 Python 编写的轻量级 Web 应用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎则使用 Jinja2 。Flask使用 BSD 授权。Flask也被称为 “microframework” ,因为它使用简单的核心,用 extension 增加其他功能,Flask中Cookie和Session有什么区别呢
    2022-10-10
  • Python 如何写入Excel格式和颜色

    Python 如何写入Excel格式和颜色

    这篇文章主要介绍了Python 写入Excel格式和颜色的实现方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • Pycharm添加虚拟解释器报错问题解决方案

    Pycharm添加虚拟解释器报错问题解决方案

    这篇文章主要介绍了Pycharm添加虚拟解释器报错问题解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • Pandas时间序列重采样(resample)方法中closed、label的作用详解

    Pandas时间序列重采样(resample)方法中closed、label的作用详解

    这篇文章主要介绍了Pandas时间序列重采样(resample)方法中closed、label的作用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12

最新评论