python-docx常用方法总结

news2024/9/27 17:35:50

由于最近有任务需要自动生成word报告,因此学习了一些python-docx的使用方法,在此总结。

目前网上相关的资料不算太多,且大多数都很简单。有一些稍微复杂的需求往往找不到答案,很多想要的方法这个库似乎并没有直接提供。在git上看,这个包最新的一次更新是2021年。希望有大神能接过这个接力棒,继续维护更新。

一、基础内容

1、document对象

整个操作过程实际就是围绕着document对象进行“增删改查”。因此,首先需要创建一个文档对象

# pip install python-docx
from docx import Document
document = Document()

上述操作会创建一个新的空白文档,如果我们想打开已有的模板文档,只需指定其路径即可

document = Document('配置/基础模板.docx')

当所有的操作完成后我们需要保存文档

document.save(os.path.join(os.getcwd(), 'xx报告.docx'))

2、插入标题

from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

# 添加一个二级标题
head = document.add_heading(level=2)
# 标题居中
head.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 标题的内容
run = head.add_run('绿水青山就是金山银山')
# 字体
run.font.name = 'Times New Roman'

3、插入一个段落

from docx.shared import Pt

# 先获得段落对象
p = document.add_paragraph()
# 首行缩进20磅
p.paragraph_format.first_line_indent = Pt(20)
# 设置段落格式
fmt = p.paragraph_format
# 设置行间距
fmt.line_spacing = 1.5    
# 一个段落可以有多个run对象,主要考虑同一段落的文字可能有多种样式
run = p.add_run('段落内容1')

这个run对象,一开始我也没太理解。已经添加了一个段落对象,直接填充段落内容不就行了嘛。段落对象下面再添加一个run对象是什么意思?原来这个run对象就是一段文本整体,这样你可以对这个整体进行统一样式设置。没有run对象的话,你就只能对段落对象进行统一设置,那就无法实现下面的效果

 对一个run对象设置字体、颜色、大小等方法如下

from docx.shared import RGBColor

# 设置字体
run.font.name = 'Times New Roman'
# 字体大小
run.font.size = Pt(20)
# 字体颜色
run.font.color.rgb = RGBColor(255, 0, 0)
# 加粗
run.font.bold = True
# 斜体
run.font.italic = True

我们一般习惯使用“小四”、“五号”来表示字体大小,但在程序里只支持传入磅值,下面是字号和磅值的对应关系。

字号和磅值对应关系
字号磅值字号磅值
八号  
 
5小三  
 
15
七号  
 
5.5三号  
 
16
小六  
 
6.5小二  
 
18
六号  
 
7.5二号  
 
22
小五  
 
9小一  
 
24
五号  10.5一号  
 
26
小四  
 
12小初  
 
36
四号  14初号  42

4、插入一个表格

添加表格一般有两种情况。第一种是创建表格时就明确行和列的数量,然后循环往里添加内容

arr = np.array([['A', '001'], ['B', '002'], ['C', '003']])
# 如果要加表头,rows=4,表格预定义样式详见官网
table = document.add_table(rows=3, cols=2, style='Colorful List')
# 添加内容
for i, row in enumerate(table.rows):
    for j, cell in enumerate(row.cells):
        # 获取单元格中的段落对象
        paragraph = cell.paragraphs[0]
        # 和上面一样,这里的run可以设置一些属性
        run = paragraph.add_run(str(arr[i, j]))

 

 第二种情况是,提前并不确定表格的行列,需要根据数据情况临时添加。则可以先创建一个1*1的表格,然后向右增加列以及向下增加行

from docx.shared import Inches
# 自动行高,无须指定
table.add_row()
# 列宽需要指定,1英寸
table.add_column(width=Inches(1))

从上述代码可以看到,一个表格(table)对象由多个行(row)对象组成,一个行(row)对象又由多个单元格(cell)对象组成。单元格对象包含段落对象,有了段落对象我们就可以添加文字并设置样式。

5、插入图片

# 指定图片文件目录,指定插入后图片所占尺寸(会根据原始尺寸和指定尺寸自动缩放)
document.add_picture('xx.png', width=Pt(500), height=Pt(400))

6、插入页眉

from docx.shared import Cm
section = document.sections[0]
header = section.header
paragraph = header.paragraphs[0]
# 也可以直接插入文字
run = paragraph.add_run()
# 这里是插入logo图片
run.add_picture("logo.png", height=Cm(0.91))

二、常见问题

1、如何指定中文字体

前面我们指定的字体是新罗马体,没什么问题。但如果我们直接将其改为'宋体'或'Sim Sun',都不会生效。这是因为宋体是非西文字体,默认是西文字体,因此不识别。需要如下操作

from docx.oxml.ns import qn
run.font.name = '宋体'
# 设置东亚字体
run._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')

2、如何自定义样式

一份文档中,标题、正文、表格内容样式基本是统一的。因此,可以预先自定义一些样式,并命名。后续即可直接通过名称应用这些样式,而不用每次都去定义。有点像格式刷的效果。

from docx.enum.style import WD_STYLE_TYPE

style = document.styles.add_style('my_style', WD_STYLE_TYPE.CHARACTER)
style.font.color.rgb = RGBColor(255, 0, 0)
style.font.name = '黑体'
style._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
style.font.size = Pt(20)
style.font.bold = True

run1 = p.add_run('社会主义核心价值观是社会主义核心价值体系的内核')
run2 = p.add_run('比心')
# 将自定义的样式应用在run2上
run2.style = 'my_style'
run3 = p.add_run('体现社会主义核心价值体系的根本性质和基本特征')

3、如何替换模板文档中文字

如果我们想基于一个模板文档进行二次编辑,可以在模板文档中设置一些占位。通过替换占位达到编辑的目的。如果是替换表格内容,可遍历单元格cell,通过对cell.text重新赋值即可。

for p in document.paragraphs:
    if p.text == '占位1':
        # 清除原有内容;也可以直接令p.text = '新的内容'
        p._element.clear()
        run = p.add_run('新的内容')
        run.font.size = Pt(18)

 使用模板文档时有一个巨坑,新建的空白文档是支持预定义的样式的,而模板文件不一定。比如你在创建表格时指定style='Colorful List',实际并不一定会生效。具体原因目前还没搞清楚。具体模板文件有哪些预定义的样式,可以通过下述方法获知。

for style in document.styles:
    print(style.name)

 预定义的样式可查看官网,下面是部分截图

4、如何合并多个文档

new_doc = Document() 

# 以此类推,将多个文档(doc2,doc3)的内容添加进去
for elem in document1.element.body:
    new_doc.element.body.append(elem)

但这种方法有一个缺点,无法复制图片。下面提供一种不使用python-docx但有效的方法。

from win32com.client import Dispatch

cwd = os.getcwd()
word = Dispatch('Word.Application')
doc_files = word.Documents.Add()
# 插入文档
doc_files.Application.Selection.Range.InsertFile(os.path.join(cwd, 'tmp1.docx'))
doc_files.Application.Selection.Range.InsertFile(os.path.join(cwd, 'tmp2.docx'))
doc_files.SaveAs(os.path.join(cwd, '合并.docx'))
# 一定要关闭
word.Quit()

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

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

相关文章

面部表情识别(Pytorch):人脸检测模型+面部表情识别分类模型

目录 0 相关资料1 基于人脸检测面部表情分类识别方法2 项目安装2.1 平台与镜像2.2 项目下载2.3 模型下载2.4 上传待测试图片2.5 项目安装 3 demo测试 0 相关资料 面部表情识别2:Pytorch实现表情识别(含表情识别数据集和训练代码):https://blog.csdn.net…

链表oj (环形链表oj)

文章目录 1.数组oj 2.链表oj 文章内容 1.数组oj 1. 原地移除数组中所有的元素值为val&#xff0c;要求时间复杂度为O(N)&#xff0c;空间复杂度为O(1)。力扣 int removeElement(int* nums, int numsSize, int val){int k numsSize;int a 0;int b 0;while(b<k){if(nu…

Centos7安装jdk8教程——rpm安装

1. rpm文件下载 下载链接 Java SE 8 Archive Downloads (JDK 8u211 and later) 2.上传到服务器指定路径下并安装 切换到上传目录&#xff0c;然后执行以下命令 rpm -ivh jdk-8u221-linux-x64.rpm3. 设置环境变量并重载配置 # 设置环境变量 vim /etc/profile# 文件末尾添加…

【网站搭建】开源社区Flarum搭建记录

环境 服务器系统&#xff1a;腾讯云 OpenCloudOS 宝塔版本&#xff1a;免费版8.0.1 Nginx&#xff1a;1.24.0 MySQL&#xff1a;5.7.42 PHP&#xff1a;8.1.21 萌狼蓝天 2023年8月7日 PHP设置 1.安装扩展&#xff1a;flieinfo、opcache、exif 2.解除禁用函数&#xff1a;putenv…

Llama 2 with langchain项目详解(一)

Llama 2 with langchain项目详解(一) 2023年2月25日,美国Meta公司发布了Llama 1开源大模型。随后,于2023年7月18日,Meta公司发布了Llama 2开源大模型,该系列包括了70亿、130亿和700亿等不同参数规模的模型。相较于Llama 1,Llama 2的训练数据增加了40%,上下文长度提升至…

直线模组在AGV物流设备起什么作用?

在物流产业高速发展的今天&#xff0c;机器人技术的应用程度已经成为决定企业间相互竞争和未来发展的重要衡量因素。智能机器人运用到物流产业&#xff0c;其效率不言而喻。AGV智能仓储作为现代物流系统的重要组成部分&#xff0c;物流自动化、智能化不光是能提升效率和安全性&…

前端懒加载

懒加载的概念 懒加载也叫做延迟加载、按需加载&#xff0c;指的是在长网页中延迟加载图片数据&#xff0c;是一种较好的网页性能优化的方式。在比较长的网页或应用中&#xff0c;如果图片很多&#xff0c;所有的图片都被加载出来&#xff0c;而用户只能看到可视窗口的那一部分…

Java GUI,mybatis实现资产管理系统

Java GUI——资产管理系统 前言&#xff1a;为了做java课设&#xff0c;学了一手Java GUI。感觉蛮有意思的&#xff0c;写写文章&#xff0c;做个视频记录一下。欢迎大家友善指出我的不足 资产管理系统录制视频&#xff0c;从头敲到尾 模块划分 资产信息管理 资产信息查询 …

【Linux取经路】进程的奥秘

文章目录 1、什么是进程&#xff1f;1.1 自己写一个进程 2、操作系统如何管理进程&#xff1f;2.1 描述进程-PCB2.2 组织进程2.3 深入理解进程 3、Linux环境下的进程3.1 task_struct3.2 task_struct内容分类3.3 组织进程3.4 查看进程属性 4、结语 1、什么是进程&#xff1f; 在…

Java GUI——网页浏览器开发

Java GUI——网页浏览器开发 前言&#xff1a;为了做java课设&#xff0c;学了一手Java GUI。感觉蛮有意思的&#xff0c;写写文章&#xff0c;做个视频记录一下。欢迎大家友善指出我的不足 网页浏览器开发录制视频&#xff0c;从头敲到尾 任务需求 界面需求 菜单栏 文件 【…

构建IT项目价值管理体系︱陆金所控股有限公司项目管理专家朱磊

陆金所控股有限公司项目管理专家朱磊先生受邀为由PMO评论主办的2023第十二届中国PMO大会演讲嘉宾&#xff0c;演讲议题&#xff1a;陆控-构建IT项目价值管理体系。大会将于8月12-13日在北京举办&#xff0c;敬请关注&#xff01; 议题简要&#xff1a; IT资源有限&#xff0c;…

常见的几大排序问题

前言&#xff1a;排序问题&#xff0c;是数据结构中的一大重要的组成板块&#xff0c;很多的面试机试中都会多多少少的涉及到排序问题&#xff0c;之前在上数据结构的那个学期整理过排序问题&#xff0c;不过大都是囫囵吞枣&#xff0c;不求甚解&#xff0c;今天&#xff0c;我…

Altium Designer (AD) 绘制原理图及双层PCB简易教程

目录 前言 工程建立 创建工程 创建原理图文件 创建PCB文件 绘制原理图 导入元件库 ​编辑绘制原理图 设置原理图标注 ​编辑​编辑 结果图​编辑 制作PCB板 生成PCB​编辑 绘制PCB边缘 设置PCB网格间距大小 走线规则设置 修改安全间距 什么是安全间距 怎样修…

在飞机设计中的仿真技术

仿真技术在飞机设计中发挥着越来越重要的作用&#xff0c;本文阐述了国内外在飞机设计中广泛使用的结构强度计算&#xff0c;多体动力学仿真、多学科多目标结构优化、内外流场分析、非线性有限元分析、疲劳强度分析、电磁仿真分析&#xff0c;机电液联合仿真分析等&#xff0c;…

数据结构基础5:栈和队列的实现。

一.栈的基本概念。 一.基本概念 1.基本概念 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出LIFO&#xff08;Last In First Out&…

java静默打印PDF(可实现生产环境下服务器写入PDF模板,然后调用客户端打印机打印)

java静默打印PDF可实现生产环境下服务器写入PDF模板&#xff0c;然后调用客户端打印机打印 一、简需求实现步骤 二、代码实现0、打印模板1、服务器部分 &#xff08;端口&#xff1a;8090&#xff09;1.1、maven依赖1.2、实体1.2.1、接口返回类1.2.2、标签纸页面参数类1.2.3、P…

【EI/SCOPUS检索】第四届应用力学与机械工程国际学术会议(ICAMME 2023)

第四届应用力学与机械工程国际学术会议&#xff08;ICAMME 2023&#xff09; 2023 4th International Conference on Applied Mechanics and Mechanical Engineering (ICAMME 2023) 第四届应用力学与机械工程国际学术会议&#xff08;ICAMME 2023&#xff09;将于2023年11月10…

期刊和会议缩写查询网站

1.https://pubmed.ncbi.nlm.nih.gov/?termMedicalImageComputingandComputer-AssistedIntervention 2. http://www.letpub.com.cn/index.php?pagejournalapp&viewsearch 3. https://blog.csdn.net/weixin_44557349/article/details/120825927 https://blog.csdn.net/ret…

Kafka:安装和配置

producer&#xff1a;发布消息的对象&#xff0c;称为消息产生者 &#xff08;Kafka topic producer&#xff09; topic&#xff1a;Kafka将消息分门别类&#xff0c;每一个消息称为一个主题&#xff08;topic&#xff09; consumer&#xff1a;订阅消息并处理发布消息的对象…

【solon生态】- solon.cloud.micrometer插件使用指南及micrometer详解

solon.cloud.micrometer插件使用指南 solon是什么solon的cloud生态图快速入门 micrometer指南micrometer是什么监控系统 Supported Monitoring Systems注册表 Registry度量 Meters度量名 Naming Meters度量标签 Tag Naming通用标签 Common Tags 指标过滤器 MeterFilter聚合速率…