Python实现办公自动化——自动编写word文档
Python实现办公自动化——自动编写word文档
- 前言
- 安装python-docx
- python-docx使用
- 创建word文档
- 设置纸张方向、大小和页边距
- 统一设置格式
- 插入文本
- 插入表格
- 插入图片
- 结语
前言
工作中有大量的报告编写需求,在不停地复制粘贴之后,突然想到,这种高度重复的工作有没有编程可以实现的方法呢?经过查找相关内容发现一个关键词叫做RPA(机器人流程自动化,各位去搜索一下这个关键词,会发现和我想要实现的需求完全一致,只是这个词一般在财务金融之类的环境中提起),那么python可以实现RPA吗?继续搜索发现有很多包,这里介绍一下python-docx,一个用来生成word文档的包。官方文档链接python-docx。
安装python-docx
使用pip就可以安装了,如果下载速度慢,需要替换为国内镜像源:
pip install python-docx
python-docx使用
创建word文档
from docx import Document
document = Document()
document.save("报告.docx")
使用Document()就完成了一个word文档的创建,我起的变量名叫document,这个步骤相当于在文件夹里鼠标右键新建了一个空的word文档。
document很重要,相当于一个还没有装水的大池子,我们所有插入内容的内容都要灌进这个池子里,专业的说法document是新建的一个对象,所有操作都要使用这个对象(document后面一个点,再加上具体要调用的方法),document操作完之后,最后一步记得调用save()方法保存文档,可以是相对路径也可以是绝对路径,如果使用相对路径,程序所在路径是根目录。
下面所有的代码都应该放在document = Document()和document.save(“报告.docx”)之间,就不再重复给出了。
设置纸张方向、大小和页边距
熟悉word操作大家肯定知道分节符,每一节中页眉页脚和边距等都是统一的。新建的document中默认有一个分节符,想要设置第一节的纸张方向和页边距,就要获取分节符对象。下面代码中section就是获取到的分节符对象,如果有好几个分节符,0代表第一个,依此类推。
import docx.shared
from docx.enum.section import WD_ORIENTATION
""" 获取第一个分节符 """
section = document.sections[0]
""" 设置横向 """
section.orientation = WD_ORIENTATION.LANDSCAPE
# 设置页面
page_h, page_w = section.page_width, section.page_height # 高度和宽度颠倒一下
# 设置横向纸的宽度
section.page_width = page_w
# 设置横向纸的高度
section.page_height = page_h
# 设置上下左右页边距
section.left_margin = docx.shared.Cm(2)
section.right_margin = docx.shared.Cm(2)
section.top_margin = docx.shared.Cm(2)
section.bottom_margin = docx.shared.Cm(2)
word文档有横向和纵向,python-docx设置横向的代码section.orientation = WD_ORIENTATION.LANDSCAPE,如果设置纵向要改为section.orientation = WD_ORIENTATION.PORTRAIT,默认是纵向的,所以一般只有横向才需要代码实现。
如果不设置纸的高度和宽度,你会发现打开的word文档好像还是“纵向”的,实际在打印的时候以及查看布局——纸张方向你会发现确实是横向的,电脑识别到的word文档和我们看起来好像不一致,为了使得观感和纸张方向统一,我们获取纸张的高宽,然后高度设置为宽度,宽度设置为高度,就可以了。
当然,如果你只需要纵向的文档,那么上面的步骤都不需要。
设置这一节内容的上下左右页边距,分别设置section的不同属性即可,python-docx对于各种距离单位,默认使用的是“磅”,也就是说section.left_margin = 2,会将左边距设置为2磅,个人还是习惯厘米做单位,不过这样的话要通过docx.shared.Cm()将厘米转换为磅,上面代码中设置边距为2厘米,通过转换函数转换为了磅。
如果要添加新的分节符:
from docx.enum.section import WD_SECTION_START
section_new = document.add_section(start_type=WD_SECTION_START.NEW_PAGE)
python-docx的函数名起的都很好理解,上面的代码不解释大家也能明白,调用document的方法新增了一个section,类型WD_SECTION_START可以选择NEW_PAGE下一节,也可以选择连续等分节符。
统一设置格式
python-docx添加的图表文字等内容都可以在"add"后再修改格式,但是这样的话文字每次add之后,都要多好几行代码去设置行距、字体、缩进等,太繁琐了,python-docx可以和word一样设置样式,add完文字后,将样式应用到文字上即可。可以新建样式,也可以修改已有样式。
""" 创建正文样式 """
from docx.oxml.ns import qn
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt, Cm
style_normal = document.styles.add_style('NORMAL STYLE', WD_STYLE_TYPE.PARAGRAPH)
style_normal.base_style = document.styles['Normal'] # 基本样式
style_normal.font.name = 'Times New Roman' # 英文字体
style_normal.element.rPr.rFonts.set((qn('w:eastAsia')), '宋体') # 中文字体
style_normal.paragraph_format.space_before = Pt(0) # 段前
style_normal.paragraph_format.space_after = Pt(0) # 段后
style_normal.font.size = Pt(14) # 字号
style_normal.paragraph_format.line_spacing = Pt(28) # 行距
style_normal.paragraph_format.first_line_indent = Pt(28) # 首行缩进
上面的代码新建了一个样式,我起名叫做NORMAL STYLE,它继承自基本样式,然后设置了自己字体和段前段后,行距缩进等,python-docx没有“字符”这个单位,所以我想首行缩进两字符只能自己去算,一个字14磅,那么首行缩进28磅就是两个字符啦。
document.styles['Normal'].font.name = 'Times New Roman' # 英文字体
document.styles['Normal'].element.rPr.rFonts.set((qn('w:eastAsia')), '宋体') # 中文字体
document.styles['Normal'].paragraph_format.space_before = Pt(0)
document.styles['Normal'].paragraph_format.space_after = Pt(0)
document.styles['Normal'].font.size = Pt(14)
document.styles['Normal'].paragraph_format.line_spacing = Pt(28)
document.styles['Normal'].paragraph_format.first_line_indent = Pt(28)
上面的代码修改了已有样式,这里将基本的Normal样式进行了修改,之后代码所有add的文字格式都会按照修改后的Normal样式。
如果新建样式,在每次add之后都要应用一下样式,如果是修改Normal样式,那么add之后不需要应用样式,如果修改其他样式,同样需要add之后应用一下样式,因为默认按照Normal的格式显示。修改Normal样式虽然不需要每次设置正文的样式,但经过作者尝试发现了一个问题,如果word文档中有表格要插入文字的话,无论怎样设置表格中文字的样式,依然会被设置为Normal样式,好像Normal的优先级很高,不是表格中的文字没有这个问题,可以正常应用其他样式,所以word文档中有表格的话,建议新建样式,不要采用修改Normal样式的方法。
word自带了很多样式,不过没必要的话不要继承一些没听过的样式,比如某个样式自带了下划线,代码里怎么设置也去不掉,会有这种情况。
插入文本
word文档有很多段落(paragraph),python-docx也有这个概念,然后进一步的,python-docx的概念中,每个段落又有很多"run"对象。
添加一段文字,可以设置段落整体的行距,首行缩进等,给段落中添加一个run,可以设置这个run里文字的格式,这样就实现了一段文字中,有不同的字体格式。
paragraph = document.add_paragraph("测试段落")
paragraph.style = "NORMAL STYLE"
添加一段文字很简单,添加之后设置style的属性,就可以应用之前添加的样式。每次调用add_paragraph,都相当于按了一次回车键,然后才是文字内容。上面提到,如果一段文字要设置不同格式,可以添加多个run。
paragraph = document.add_paragraph(style="NORMAL STYLE")
run = paragraph.add_run("尊敬的")
run.font.name = "黑体"
run = paragraph.add_run("XX女士/先生")
run.font.name = "宋体"
和设置样式类似,段落以及run都可以设置里面的字体大小等属性进行细节的格式修改。
插入表格
table = document.add_table(rows=5, cols=5, style='NORMAL STYLE')
table.cell(0, 0).text = '测试'
table.rows[1].cells[0].merge(table.rows[1].cells[1])
表格的添加很简单,在新建表格时设置好行列参数,并且可以设置表格内文字的样式,前面提到过,如果修改word自带的Normal样式的话这里的设置样式会失效。table.cell可以获取具体几行几列的单元格,调用.text修改内容。使用merge可以合并单元格,上面的代码表示将第2行第1列单元格和第2行第2列单元格合并(python计数从0开始)。如果有多个单元格合并,只能一个一个进行,我一般是写一个循环实现。如果合并单元格对应的原始单元格有多个填充了文字,那么和excel类似,只会保留第一个单元格的内容。
插入图片
添加图片,同样简单粗暴,add_picture搞定,类似于设置文字的属性一样,我们可以设置图片的一些属性,一般对图片设置主要是设置大小,我获取了图片的高度和宽度(默认单位是磅),然后将磅转换为了厘米,把图片设置为厘米单位的高度宽度。figurepath大家自己替换为图片的文件地址即可。
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
run = paragraph.add_run()
pic = run.add_picture(figurepath)
original_width, original_height = pic.width, pic.height
change_ratio = (7/2.54*914400) / original_height
scaled_width = int(original_width * change_ratio)
scaled_height = int(original_height * change_ratio) # 缩放至7cm
pic.width = scaled_width # 缩放
pic.height = scaled_height # 缩放
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
结语
python-docx使用十分方便,不过也需要注意,它主要是用来按照代码生成新的word文档的(虽然也可以读取已有word文档,但是功能较弱),如果已有一些word文档,想要读取word文档并在指定位置做修改,要用到更底层的pywin32等包才能实现需求。python-docx本质上是在新建一个文件,只不过这个文件按照word文档的规范编排,如果你的电脑没有安装word程序,python-docx生成word文档依然可以正常执行,只是需要换一台装了word的电脑才可以正常打开阅读,而pywin32等包加载已有的word文档,需要通过运行word程序来操作,必须要安装word程序才能实现,本质上是程序代替你打开word来操作,好处是这样可以进行的格式编排会比python-docx更精细,但是代码会更加底层和复杂。
可能还有的人会问,python-docx插入文字,图,表之类的,和word模板岂不是很类似?如果单从python-docx一个包来看,实现的功能会有点类似,但是python-docx可以与其他工具包配合,将大量数据的计算,绘制图表与word文档结合起来,这样的强大功能是word模板完全无法相比的。鼠标一点,几十页的报告一键生成,这样的便利性只有各位在实际工作中用到了才能真正体会到O(∩_∩)O。
相关文章:
Python实现办公自动化——自动编写word文档
Python实现办公自动化——自动编写word文档 前言安装python-docxpython-docx使用创建word文档设置纸张方向、大小和页边距统一设置格式插入文本插入表格插入图片 结语 前言 工作中有大量的报告编写需求,在不停地复制粘贴之后,突然想到,这种高…...

番外篇 | BGF-YOLO:引入双层路由注意力、广义特征金字塔网络和第四检测头,提高YOLOv8检测性能
前言:Hello大家好,我是小哥谈。本文提出了一种名为BGF-YOLO的新模型,通过引入双层路由注意力、广义特征金字塔网络和第四检测头,提高YOLOv8在脑肿瘤检测中的性能,采用多层特征融合与动态稀疏注意机制以减少特征冗余。 🌈 目录 🚀1.基础概念 🚀2.网络结构 �…...
Python运维自动化之字典Dict
字典Dict(哈希表) Dict即Dictionary,也称为mapping。 Python中,字典由任意个元素构成的集合,每一个元素称为Item,也称为Entry。这个Item是由(key, value)组成的二元组。 字典是可变的、无序的、key不重复的key-value键值对集合。…...

axios请求拦截器和响应拦截器,封装naive-ui的 Loading Bar加载条和useMessage消息提示
接之前的博客设计从0开始边做边学,用vue和python做一个博客,非规范化项目,怎么简单怎么弄,跑的起来有啥毛病解决啥毛病(三),目前已经完成了基本的功能demo,但是请求接口不可能每个页…...
9.Python 条件语句和循环语句
文章目录 Python 条件语句和循环语句1. **条件语句 (Conditional Statements)**1.1 if 语句1.2 if-else 语句1.3 if-elif-else 语句 2. **循环语句 (Loop Statements)**2.1 while 循环2.2 for 循环2.3 循环嵌套 (Nested Loops) 3. **控制循环的语句**3.1 break 语句3.2 continu…...
智能家居控制系统设计
设计智能家居控制系统是一个复杂但有趣的项目,它涉及硬件与软件的集成、网络通信、用户界面设计等多个方面。以下是一个智能家居控制系统的基本设计思路: 1. 需求分析- 功能需求:明确系统需要实现的功能,如灯光控制、空调温度调节…...

Windows系统word插入公式自动编号并交叉引用
一、定义新的多级列表 鼠标单击页面空白处 二、插入域 鼠标单击要插入公式编号的地方 三、交叉引用 鼠标单击要引用公式编号的地方 四、更新编号(域) CtrlA:全选全文 鼠标右键:更新域...
0.基础语法
文章目录 1. 第一个 Python 程序2. Python2.x 和 Python3.x 的差异3. 标识符和保留字符4. 行和缩进5. 多行语句6. 引号7. 注释8. 空行9. 用户输入10. Print 输出11. 代码组12. 命令行参数 Python 基础语法涵盖了从安装和运行 Python 程序到理解语言核心概念的各个方面。以下是基…...

mysql命令行界面(黑框)的登录
文章目录 开启关闭服务报错登录mysql退出mysql数据据database在电脑中的存放位置删除数据库语句 drop注意 cmd用管理员打开 开启关闭服务 报错 我有这个报错,但是使用没什么影响 登录mysql root替换成自己的用户名 退出mysql exit 数据据database在电脑中的…...

【机器学习】解构概率,重构世界:贝叶斯定理与智能世界的暗语
文章目录 条件概率与贝叶斯定理:深入理解机器学习中的概率关系前言一、条件概率与贝叶斯定理1.1 条件概率的定义与公式1.1.1 条件概率的定义1.1.2 条件概率的实例讲解 1.2 条件概率的性质与法则1.2.1 链式法则1.2.2 全概率公式1.2.3 贝叶斯定理的推导 1.3 贝叶斯定理…...

threejs——无人机概念切割效果
主要技术采用着色器的切割渲染,和之前写的风车可视化的文章不同,这次的切割效果是在着色器的基础上实现的,并新增了很多可调节的变量,兄弟们,走曲儿~ 线上演示地址,点击体验 源码下载地址,点击下载 正文 从图中大概可以看出以下信息,一个由线组成的无人机模型,一个由…...

electron学习笔记(一)
1.创建项目 mkdir myelectron npm init npm install --save-dev electron //安装通过以上命令, 我们就有了一个 electron 的项目 之后, 设置主文件入口 , 添加热启动 nodemon 2. nodemon 的使用和配置 要根目录下添加 nodemon.json 文件,配…...

基于Arduino蹲便器的自动清洁系统(论文+源码)
1系统整体设计 经过上述的方案分析,最终确定了Arduino UNO开发板为核心,结合蓝牙模块,舵机,电磁阀,红外传感器,步进电机,舵机等硬件设备来构成整个控制系统,整体框图如图2.1所示。其…...
【JavaWeb后端学习笔记】使用HttpClient发送Http请求
使用HttpClient发送Http请求需要在项目中导入相关依赖: <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version> </dependency>1、 HttpClient…...

2024告别培训班 数通、安全、云计算、云服务、存储、软考等1000G资源分享
大类有:软考初级 软考中级 软考高级 华为认证 华三认证: 软考初级: 信息处理技术员 程序员 网络管理员 软考中级: 信息安全工程师 信息系统监理师 信息系统管理工程师 嵌入式系统设计时 数据库系统工程师 电子商务设…...

【C++】- 掌握STL List类:带你探索双向链表的魅力
文章目录 前言:一.list的介绍及使用1. list的介绍2. list的使用2.1 list的构造2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers2.6 list的迭代器失效 二.list的模拟实现1. list的节点2. list的成员变量3.list迭代器相关问题3.1…...
基于streamlit搭简易前端页面
前端小白第一次用streamlit搭简易页面,记录一下。 一些tips 每次与页面进行交互,如点击按钮、上传文件等,streamlit就会重新运行整个页面的所有代码。如果在页面渲染前需要对上传文件做很复杂的操作,重新运行所有代码就会重复这…...

Harmony Next开发通过bindSheet绑定半模态窗口
示例概述 Harmony Next开发通过bindSheet绑定半模态窗口 知识点 半模态窗口父子组件传值 组件 LoginComponent Component struct LoginComponent {// Prop 父子单项绑定值Prop message:string // Link 父子双向绑定值Link userName:stringLink password:stringLink isSh…...

YOLOv11改进,YOLOv11添加DLKA-Attention可变形大核注意力,WACV2024 ,二次创新C3k2结构
摘要 作者引入了一种称为可变形大核注意力 (D-LKA Attention) 的新方法来增强医学图像分割。这种方法使用大型卷积内核有效地捕获体积上下文,避免了过多的计算需求。D-LKA Attention 还受益于可变形卷积,以适应不同的数据模式。 理论介绍 大核卷积(Large Kernel Convolu…...

【51单片机】矩阵按键快速上手
51单片机矩阵按键是一种在单片机应用系统中广泛使用的按键排列方式,特别适用于需要多个按键但I/O口资源有限的情况。以下是对51单片机矩阵按键的详细介绍: 一、矩阵按键的基本概念 定义:矩阵按键,又称行列键盘,是…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...

MODBUS TCP转CANopen 技术赋能高效协同作业
在现代工业自动化领域,MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步,这两种通讯协议也正在被逐步融合,形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决
Spring Cloud Gateway 中自定义验证码接口返回 404 的排查与解决 问题背景 在一个基于 Spring Cloud Gateway WebFlux 构建的微服务项目中,新增了一个本地验证码接口 /code,使用函数式路由(RouterFunction)和 Hutool 的 Circle…...

C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...