Python自动化办公:docx篇

news2024/10/7 10:21:46

文章目录

  • 简介
  • 官方demo
  • 读取并修改已存在的docx
  • 参考文献

202201笔记迁移

简介

python的docx包是可以用来自动化处理docx文件,可以从无到有生成一个docx文件,也可以对已有的docx文件做批量修改。(但印象里是只能操作.docx文件,如果想操作.doc文件,得先另存为.docx先)

使用的第一步是安装,

pip install python-docx

注意安装的是python-docx,不要直接pip install docx,docx这个包虽然能够安装成功,但是无法使用。(至于为什么,可以参照参考文献2)

官方demo

官方文档,即参考文献1中直接列了一个简单的demo供大家使用,可以从中看到是如何一步一步自动生成一个docx。

为了更好的说明docx包的功能,我基于官方demo做了一些补充。

from docx import Document
from docx.shared import Inches, Pt

root_path = 'D:/Document/1-2021碎片学习/12-python/word自动化/docx_sample/'

# 以空白模板,来创建一个文档对象
document = Document()

# 设置document的全局样式,normal代表的应该是全部样式元素
# 需要注意的是,document、paragraph和run都可以自行设置样式style,且遵循就近原则,越往下,style的优先级越高。
document.styles['Normal'].font.name='Microsoft Yahei UI'
document.styles["Heading 1"].font.size=Pt(29)   #设置全局1级标题的字体大小为29

# 创建标题,level参数用来控制标题级别,如果level=0,表示创建一个title
document.add_heading('Document Title', 0)

# 添加一个段落,(并设置其初始化文字)
p = document.add_paragraph('A plain paragraph having some ')
# 以节段run的形式,继续往该段落添加文字,并设置样式
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')  # 添加一个引用式段落

# 添加一个列表式段落
document.add_paragraph(
    'first item in unordered list', style='List Bullet'
)
# 添加一系列自行标号的列表段落
document.add_paragraph(
    'first item in ordered list', style='List Number'
)
document.add_paragraph(
    'two item in ordered list', style='List Number'
)



# 添加一个图片
document.add_picture(root_path + 'data/VF.jpeg', width=Inches(1.25))

records = (
    (3, '101', 'Spam'),
    (7, '422', 'Eggs'),
    (4, '631', 'Spam, spam, eggs, and spam')
)
# 添加一个table,并赋值
table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

# 设置分页符
document.add_page_break()

# 保存成实体文件
document.save(root_path + 'data/demo.docx')

最终生成的docx文件长什么样子呢?

在这里插入图片描述

短短几行,基本写尽了python-docx的基础功能。

可以生成:

  • 各级标题
  • 各种格式的内容文本,部分加粗、斜体等都可以;
  • 各种列表;
  • 添加图片;
  • 添加表格;

下面对python-docx的几大元素做简单介绍,最后再配一个操作现成docx的实例。

首先介绍几个基本概念(以下简称三要素):

  • Document:是一个word文档对象,一个word在内存中是以一个Document对象的形式存在的;
  • Paragraph:直译,就是段落,word文档中的内容由一个个段落组成。当在文档中输入一个回车键,就会形成一个新的段落。输入shift + enter,即软回车,不会分段,而是在段内换行;
  • Run:表示一个节段,每个段落由多个节段组成。一个段落中具有相同样式的连续文本,组成一个节段。因此一个Paragraph对象由一个Run列表组成。

举一个例子来表示run和paragraph的关系:(图片来源于参考文献3)

在这里插入图片描述

以上的结构实际上是:

在这里插入图片描述

注意倒数第二行后面是一个软回车,所以它跟倒数第一行是一个paragraph。第二行是空,只有一个回车符,所以没有run。

等回头写一个验证一下。

关于样式,document、paragraph和run都可以自行设置样式style,且遵循就近原则,越往下,style的优先级越高,即在某个paragraph中,document所设置的全局样式可以被paragraph设置的样式覆盖。如果一个paragraph没有指定自己的style,那就跟着document的normal样式走。

读取并修改已存在的docx

事实上,日常生活中,创建一个docx的场景还是少的,应用最多的还是批量读取已存在的docx,并做修改。

下面首先以上一段生成的docx文件,来简单解析一下它在内存层次的存在形式,并根据之前做过的一个例子,来讲一下实际怎么使用这个包。

以下为简单示例,旨在展示简单的批量文本替换

# 读取一个已存在的docx示例
from docx import Document
import os

root_path = 'D:/Document/1-2021碎片学习/12-python/word自动化/docx_sample/'
data_path = os.path.join(root_path, 'data/')

document = Document(os.path.join(data_path, 'demo.docx'))

print(document)

# 每个文档对象下都有一个paragraphs列表,由paragraph组合而成
print(document.paragraphs)

for p in document.paragraphs:
    # print(p)
    # print(p.text)
    for run in p.runs:  # 一个paragraph也是由多个run组成
        # print(run)
        print(run.text)     # 可尝试修改demo.docx文件,来调整run
        if run.text == 'bold':  # 对关键字做替换
            run.text = 'bold bold'
document.save(os.path.join(data_path, 'new_demo.docx'))

所以如果只是要做批量的文本替换,实际上可以先调校好模板,(通过加粗或者字体等样式操作)让需要被替换的文字单独成一个run,然后循环的时候对这个run做if判断就可以了。

参考文献

  1. python-docx 官方文档,说实话写的有点简略
  2. from docx import Document报错的问题
  3. Word 神器 python-docx 写的挺不错的,尤其是对三要素的解释上,图文并茂,绝了
  4. Python操作Word的入门教程
  5. 一个浏览器包
  6. python-docx中关于style的可选值列取但是并没有详细解释每一种style用出来是什么效果
  7. python-docx设置段落格式 设置全局样式,段落样式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/774998.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【电路原理学习笔记】第5章:串联电路:5.2 串联电路的总电阻

第5章:串联电路 5.2 串联电路的总电阻 5.2.1 串联电阻相加 由于每个电阻对电流的阻力与其阻值成正比,因此,当电阻串联时,电阻值要相加串联电阻的数量越多,对电流的阻力就越大,也就意味着更大的电阻。因此…

收入下滑,亏损严重,面临法律诉讼的中驰车福申请纳斯达克IPO上市

来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,来自北京的汽车产业供应链数字化服务商【中驰车福】(Autozi Internet Technology (Global) Ltd)近期已向美国证券交易委员会(SEC)提交招股书&#x…

新建Mybatis流程

删除src目录 pom文件夹下导入依赖 这样的话每次只用改父项目的内容,就不必每次都导包 1.修改这三个文件 2.mybatis-config.xml的配置文件有顺序的规定,properties需要写在最上面。 3.类型别名

Bridging the Gap Between Anchor-based and Anchor-free Detection via ATSS 论文学习

1. 解决了什么问题? Anchor-based 和 anchor-free 方法的本质差异其实是如何定义正负样本,如果训练过程中它们采用相同的正负样本定义,最终的表现是差不多的。也就是说,如何选取正负样本才是最重要的。 以单阶段 anchor-based 方…

C++初探

目录 经典开头 — C的历史 作用域运算符 using的用法 命名空间 - namespace 命名空间的基本使用 特殊的命名空间 - 无名命名空间 全部展开和部分展开 std — C所有的标准库都在std命名空间内 省缺值 - 默认参数 占位参数 内联函数 - inline 函数重载 函数重载的用…

MySQL八股学习过程2行的存储 from 小林coding

MySQL八股学习过程2行的存储 from 小林coding MySQL数据的存放MySQL表结构InnoDB行格式记录的额外信息记录的真实数据 MySQL数据的存放 下面的命令能够查询到MySQL数据库文件的存放位置 SHOW VARIABLES LIKE datadir;一张表的结构会保存在表同名.frm中,数据会保存在表同名.ib…

导轨式 称重传感器 压力应变桥信号处理 隔离变送器

主要特性 DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源,向输入端和输…

Kyuubi的介绍优势(官网链接)

官网链接:https://kyuubi.apache.org/ Apache Kyuubi™ 是一个分布式多租户网关,用于在数据仓库和 Lakehouse 上提供无服务器 SQL。 Kyuubi 在各种现代计算框架(例如 Apache Spark、 Flink、 Doris、 Hive和Trino等)之上构建分布…

CMU 15-445 Project #2 - B+Tree(CHECKPOINT #2)

CHECKPOINT #2 一、题目链接二、准备工作三、部分实现1.锁操作操作类型定义安全页面判断加锁操作解锁操作叶子页面查找操作 2.查找操作3.插入操作4.删除操作 四、评测结果 一、题目链接 二、准备工作 见 CMU 15-445 Project #0 - C Primer 中的准备工作。 三、部分实现 1.锁操…

linux安装conda

linux安装conda 卸载conda 在主目录下,使用普通权限安装: ./Anaconda3-2023.03-1-Linux-x86_64.shanaconda的目录是ENTER

139. 单词拆分

139. 单词拆分 原题链接:完成情况:解题思路:参考代码: 原题链接: 139. 单词拆分 https://leetcode.cn/problems/word-break/ 完成情况: 解题思路: dp动态递归去接,算0-n所有范围…

Xshell 7 评估期已过继续免费使用方法

1. 评估期已过的示例 2.解决方法 如果需要继续使用,一是去网上寻找绿色版本的Xshell,但是可能不安全。 二是重新下载一个免费版本,覆盖安装即可。 2.1 官网下载地址:https://www.xshell.com/zh/free-for-home-school/ 2.2下载安…

Pytorch:利用torchvision调用各种网络的预训练模型,完成CIFAR10数据集的各种分类任务

2023.7.19 cifar10百科: [ 数据集 ] CIFAR-10 数据集介绍_cifar10_Horizon Max的博客-CSDN博客 torchvision各种预训练模型的调用方法: pytorch最全预训练模型下载与调用_pytorch预训练模型下载_Jorbol的博客-CSDN博客 CIFAR10数据集下载并转换为图片&am…

gitlab配置公钥

1、打开本地git bash,使用如下命令生成ssh公钥和私钥对 ssh-keygen -t rsa -C yourEmailgitlab.com2、然后打开~/.ssh/id_rsa.pub文件,复制里面的内容 cd ~/.ssh ls cat ./id_rsa.pub3、打开gitlab,找到Profile Settings–>SSH Keys—>Add SSH Key,并把上一…

【多线程】(六)Java并发编程深度解析:常见锁策略、CAS、synchronized原理、线程安全集合类和死锁详解

文章目录 一、常见锁策略1.1 乐观锁和悲观锁1.2 读写锁1.3 重量级锁和轻量级锁1.4 自旋锁1.5 公平锁和非公平锁1.6 可重入锁和不可重入锁 二、CAS2.1 什么是CAS2.2 CAS的实现原理2.3 CAS应用2.4 ABA问题 三、synchronized原理3.1 synchronized锁的特点3.2 加锁工作过程3.3 锁消…

VM(CentOS7安装和Linux连接工具以及换源)

目录 一、Linux意义 二、安装VMWare 三、centos7安装 1、正式安装CentOS7: 2、安装不了的解决方案 2.1常见问题——虚拟机开机就黑屏的完美解决办法 3、查看、设置IP地址 ① 查看ip地址:ip addr 或者 ifconfig, 注意与windows环境的区别…

labelme+sam在windows上使用指南

其实官网讲的很清楚了,这里做一个笔记,方便自己后面直接看。 首先,贴一下官方的链接,作者老哥很强,respect! 使用流程: https://github.com/wkentaro/labelme#installation 资源: ht…

数据库锁机制

锁机制 1. 概述2. 并发事务的不同场景2.1 读-读情况2.2 写-写情况2.3 读-写或写-读情况2.3.1 方案一:读事务使用MVCC(多版本并发控制),写事务加锁2.3.2 方案二:读、写事务均加锁 3. 锁分类3.1 从数据操作类型&#xff…

1.Docker概念

文章目录 Docker概念Docker容器与虚拟机的区别内核中的2个重要技术Linux Namespace的6大类型docker三个重要概念部署Dockeryum安装二进制安装 Docker 概念 docker是一个开源的应用容器引擎,基于go语言开发并遵循了apache2.0协议开源。docker可以让开发者打包他们的…

【PostgreSQL内核学习(三)—— 查询重写】

查询重写 查询重写系统规则视图和规则系统ASLO型规则的查询重写规则系统与触发器的区别 查询重写的处理操作定义重写规则删除重写规则对查询树进行重写 声明:本文的部分内容参考了他人的文章。在编写过程中,我们尊重他人的知识产权和学术成果&#xff0c…