Python实现办公自动化——自动编写word文档

news2024/12/16 8:24:34

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。

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

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

相关文章

WebView2教程(基于C++)【一】环境初始化

创建一个VisualStudio C项目,通过NuGet包管理器安装两个包: 注意,在项目属性页设置项目使用:C 20,子系统设置成窗口(相应的预处理器也要改变),DPI识别设置成每个监视器高DPI识别。 …

KMP算法图解解析(C语言)

文章目录 一.引言二.KMP算法解析三.代码实现1.对目标子串的处理(创建next数组)二.寻找子串的KMP算法实现 一.引言 kmp算法是由三位大牛共同研究提出的,全称为Knuth-Morris-Pratt算法,简写为KMP算法。 kmp算法用来解决子串的问题&a…

数据冒险、控制冒险、结构冒险

计算机组成原理 数据冒险、控制冒险、结构冒险 对所有用户(所有程序员)可见:PSW、PC、通用寄存器 PSW(条件转移需要用到,程序员使用CMP指令的时候也需要用到所以是对用户可见)PC(跳转指令需要…

Python机器学习笔记(七、深度学习-神经网络)

深度学习算法经过精确调整,只适用于特定的使用场景。先学习较为简单的深度学习算法,用于分类和回归的多层感知机(multilayer perceptron,MLP),它可以作为研究更复杂的深度学习方法的起点。MLP 也被称为&…

Kylin麒麟操作系统 | Nginx服务部署

目录 一、理论储备1. Nginx概述2. Nginx与Apache的区别3. Nginx的服务配置 二、任务实施任务1 Nginx的编译安装1. Server配置2. 客户端测试 任务2 Nginx反向代理1. Server1配置2. Server2配置3. 客户端测试 一、理论储备 1. Nginx概述 Nginx是一个轻量级的web服务器&#xff…

【html网页页面012】html+css制作品牌主题宏宝莱网页含视频、留言表单(7页面附效果及源码)

品牌主题宏宝莱网页制作 🥤1、写在前面🍧2、涉及知识🌳3、网页效果完整效果(7页):代码目录结构:page1、首页page2、衍生品page3、包装设计page4、视频介绍page5、留言板page6、联系我们page7、详情页(三层页…

机器学习之交叉熵

交叉熵(Cross-Entropy)是机器学习中用于衡量预测分布与真实分布之间差异的一种损失函数,特别是在分类任务中非常常见。它源于信息论,反映了两个概率分布之间的距离。 交叉熵的数学定义 对于分类任务,假设我们有&#…

0001.基于springmvc简易酒店管理系统后台

一.系统架构 springmvcjsplayuimysql 二.功能特性 简单易学习,虽然版本比较老但是部署方便,tomcat环境即可启用;代码简洁,前后端代码提供可统一学习;祝愿您能成尽快为一位合格的程序员,愿世界没有BUG; …

无限次使用 cursor pro

github地址 cursor-vip 使用方式 在 MacOS/Linux 中,请打开终端; 在 Windows 中,请打开 Git Bash。 然后执行以下命令来安装: 部分电脑可能会误报毒,需要关闭杀毒软件/电脑管家/安全防护再进行 方式1:通过…

AI 语言模型产业的投资困境与发展困境分析

https://benn.substack.com/p/do-ai-companies-work 巨额投资与成本困境 大型语言模型(LLM)的开发成本惊人。根据报道,OpenAI 正在筹集 65 亿美元资金,每年约消耗 70 亿美元用于研究、开发新的 AI 服务和扩充团队。Anthropic 预计…

tryhackme——Pre Security(安检前)-Offensive Security(进攻性安全)

这里我用的edge的插件闪击翻译。这里我英语不好,所以用这个可以顺便学习下英语。 任务一:What is Offensive Security?(什么是进攻性安全?) 很简单啊,通过阅读,知道以下哪个选项更能代表您模拟黑客操作…

[论文阅读] |智能体长期记忆与反思

写在前面:10月份的时候,联发科天玑9400发布,搭载这款旗舰 5G 智能体 AI 芯片的荣耀MagicOS9.0实现了一句话让手机自动操作美团点咖啡。很快商场实体店里便能看到很多品牌手机已经升级为智能体语音助手。下一步,这些智能体或许便能…

CQRS Design Pattern in Microservices - CQRS模式

原文链接 CQRS Design Pattern in Microservices - GeeksforGeeks 【文章看起来像是AI写的。。。 😂😂😂】 简介 实现步骤 1,识别有界上下文:(Identify Bounded Contexts:) 2,命…

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二)

《拉依达的嵌入式\驱动面试宝典》—C/CPP基础篇(二) 你好,我是拉依达。 感谢所有阅读关注我的同学支持,目前博客累计阅读 27w,关注1.5w人。其中博客《最全Linux驱动开发全流程详细解析(持续更新)-CSDN博客》已经是 Linux驱动 相关内容搜索的推荐首位,感谢大家支持。 《拉…

RPC远程服务调用详解和gRPC简介

RPC (Remote Procedure Call)是远程过程调用,比如说现在有两台服务器A, B,一个在A服务器上的应用想要调用B服务器上的应用提供的某个,由于不在两个方法不在一个内存空间,不能直接调用,需要通过网络表达调用的语义和传达…

计算机网络知识点全梳理(三.TCP知识点总结)

目录 TCP基本概念 为什么需要TCP 什么是TCP 什么是TCP链接 如何唯一确定一个 TCP 连接 TCP三次握手 握手流程 为什么是三次握手,而不是两次、四次 为什么客户端和服务端的初始序列号 ISN 不同 既然 IP 层会分片,为什么 TCP 层还需要 MSS TCP四…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者,我总喜欢翻看各种项目附带的论文,虽然大多时候是瞎研究,但却乐在其中。该项目能够完美保留公式、图表、目录和注释,对于需要阅读外文文献的…

前端成长之路:CSS元素显示模式

元素显示模式 网页中的标签非常的多,在不同的地方会使用到不同类型的标签,了解这些标签的特点可以更好的布局我们的网页。 元素显示模式就是元素(标签)按照什么方式进行显示,比如:div标签会自己独占一行&a…

如何在 Ubuntu 22.04 上使用 vnStat 监控网络流量

简介 vnStat是一个免费的、开源的、基于控制台的Linux操作系统网络流量监控工具。通过vnStat,你可以在不同的时间段监控网络统计数据。它简单、轻量级,并且消耗的系统资源很小。vnStat允许你按小时、日、月、周和日生成网络流量数据。本教程将向你展示如…

解决pip下载慢

使用pip下载大量安装包,下载速度太慢了 1、问题现象 pip安装包速度太慢 2、解决方案 配置国内源 vi /root/.config/pip/pip.conf[global] timeout 6000 index-url https://mirrors.aliyun.com/pypi/simple/ trusted-host mirrors.aliyun.com