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单片机矩阵按键的详细介绍: 一、矩阵按键的基本概念 定义:矩阵按键,又称行列键盘,是…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
前端调试HTTP状态码
1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...
对象回调初步研究
_OBJECT_TYPE结构分析 在介绍什么是对象回调前,首先要熟悉下结构 以我们上篇线程回调介绍过的导出的PsProcessType 结构为例,用_OBJECT_TYPE这个结构来解析它,0x80处就是今天要介绍的回调链表,但是先不着急,先把目光…...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
