1、安装python-docx

我们使用python-docx来操作word文档,首先是安装:

pip install python-docx -i https://pypi.tuna.tsinghua.edu.cn/simple

然后放两个参考文档:

  • 官方手册:https://python-docx.readthedocs.io/en/latest/index.html
  • pypi官方地址:https://pypi.org/project/python-docx/

使用步骤

  • 步骤1 导入docx模块
  • 步骤2 创建或读取一个文档对象
  • 步骤3 向文档写入内容
  • 步骤4 生成docx文件

上代码:

# 步骤1
from docx import Document# 步骤2
document = Document()  # 新建文档对象
# document = Document("test.docx")  # 读取现有word文档,建立文档对象# 步骤3
...# 步骤4
document.save("test.docx")  # 保存文档

2、添加标题

要求:添加标题,能设置标题的字体、大小、颜色等

上代码:

from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qnd = Document()
# 第一种设置标题的方式
d.add_heading("一级标题 hello world", level=0)# 第二种设置标题的方式,此方式还可以设置文本的字体、颜色、大小等属性
run = d.add_heading("", level=1).add_run("二级标题")
# 设置西文字体
run.font.name = u'宋体'
# 设置中文字体
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# 设置字体颜色
run.font.color.rgb = RGBColor(255, 55, 55)  # 红色
# 设置字体大小
run.font.size = Pt(30)
# 设置下划线
run.font.underline = True
# 设置删除线
run.font.strike = True
# 设置加粗
run.bold = True
# 设置斜体
run.italic = True
# 保存文档
d.save("test.docx")

代码解释:

方法名 描述
add_heading(text="", level=1) 写入标题,默认标题样式为level1,level范围为0-9
add_run(text=None, style=None) 可以添加文本(包括标题、正文、表格文字等),并且能为其设置字体格式、颜色、大小等属性
  • 设置字体有两种方式,一种是全局配置,但是只对正文起作用:

    d = Document()
    d.styles['Normal'].font.name = u'宋体'
    d.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    
  • 但是上面这种方式无法对add_heading()起作用,需要对标题设置字体,需要使用下面这种方式:
    run = d.add_heading("", level=3).add_run("三级标题")
    run.font.name = u'宋体'
    run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
    
  • 使用run.font.size = Pt(30)设置字体大小,Pt表示磅,与字号对应关系如下:
    号数 磅值 (Pt)
    初号 42
    小初 36
    一号 26
    小一 24
    二号 22
    小二 18
    三号 16
    小三 15
    四号 14
    小四 12
    五号 10.5
    小五 9
    六号 7.5
    小六 6.5
    七号 5.5
    八号 5

3、添加段落

举例1:段落、分页、有序列表、无序列表、引用

上代码

from docx import Document
from docx.shared import Pt
from docx.oxml.ns import qnd = Document()
# 设置全局属性
d.styles['Normal'].font.size = Pt(20)
d.styles['Normal'].font.name = u'Times New Roman'
d.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
# 新增一个段落
p1 = d.add_paragraph("这是第一个段落:")
# 继续添加文字
run = p1.add_run("段落中的文字")
run.font.size = Pt(10.5)
run.font.name = u'宋体'
run._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# 有序列表
d.add_paragraph("有序列表1111", style="List Number")
d.add_paragraph("有序列表2222", style="List Number")
# 无序列表
d.add_paragraph("无序列表3333", style="List Bullet")
d.add_paragraph("无序列表4444", style="List Bullet")
# 引用
d.add_paragraph("引用5555", style="Intense Quote")
# 在段落p1前添加一个段落
p1.insert_paragraph_before("在段落p1前添加一个段落,我才是第一个段落")
# 增加分页
d.add_page_break()
# 添加一个段落
p2 = d.add_paragraph("我是新分页中的段落")
# 新分页中文字首行缩进两个字
p2.paragraph_format.first_line_indent = Pt(20) * 2
d.save("1111.docx")

效果图:

代码解释:

方法名 描述
add_paragraph(text="", style=None) 1、插入段落,通过style可以设置插入段落的类型
2、List Number 表示有序段落
3、List Bullet 表示无序段落
4、Intense Quote 表示引用
insert_paragraph_before(text=None, style=) 插入段落到现有段落之前
add_page_break() 新增分页,后续的内容会出现在新的分页中
  • 字体效果:如果设置了全局的字体属性,那么所有正文都是那种字体,但是可以通过add_run()对象设置新的字体
  • 首行缩进:通过设置paragraph_format.first_line_indent属性可以设置缩进大小为当前字体大小的2倍

举例2:对齐、间距、行距

上代码

from docx import Document
from docx.shared import Pt, Inches
from docx.oxml.ns import qn
from docx.enum.text import WD_PARAGRAPH_ALIGNMENTd = Document()
d.styles['Normal'].font.size = Pt(20)
d.styles['Normal'].font.name = u'Times New Roman'
d.styles['Normal'].element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')
p = d.add_paragraph("《静夜思》""床前明月光,""疑似地上霜。""举头望明月,""低头思故乡。")
# 设置对齐格式
# 可选项有LEFT、CENTER、RIGHT、JUSTIFY、DISTRIBUTE等
p.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
# 设置段落缩进
d.add_paragraph("右缩进,0.5英寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸寸").paragraph_format.right_indent = Inches(0.5)
d.add_paragraph("左缩进,20磅").paragraph_format.left_indent = Pt(20)
d.add_paragraph("首行缩进2个字符").paragraph_format.first_line_indent = Pt(20) * 2
# 设置段落间距 1.5倍行间距 1.5, 单倍行间距 1.0
d.add_paragraph("line_spacing设置为浮点数,表示行间距为行高的倍数").paragraph_format.line_spacing = 1.5
d.add_paragraph("line_spacing设置为具体的长度值,表示绝对距离").paragraph_format.line_spacing = Pt(50)
d.add_paragraph("space_before表示段前间距").paragraph_format.space_before = Pt(100)
d.add_paragraph("space_after表示段后间距").paragraph_format.space_after = Pt(30)
# 设置段落内部文字在遇到需分页情况时处理状态
p2 = d.add_paragraph("很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落很长的段落")
p2.paragraph_format.keep_together = True  # 段中不分页
p2.paragraph_format.keep_with_next = True  # 与下段同页
p2.paragraph_format.page_break_before = True  # 段前分页
p2.paragraph_format.widow_control = True  # 孤行控制
d.save("11111.docx")

效果图:

代码解释:

  • 段落对齐格式WD_PARAGRAPH_ALIGNMENT有多个可选项

    • LEFT 表示左对齐
    • CENTER 表示居中对齐
    • RIGHT 表示右对齐
    • JUSTIFY 表示两端对齐
    • DISTRIBUTE 表示散列对齐
  • add_paragraph()对象可以设置paragraph_format的多种属性,包括:
    • 对齐方式 alignment
    • 段落缩进 right_indent left_indent first_line_indent
    • 段落间距 space_before space_after
    • 行间距 line_spacing
    • 分页设置 keep_together keep_with_next page_break_before widow_control
  • 分页设置的属性说明:
    • keep_together 段中不分页
    • keep_with_next 与下段同页
    • page_break_before 在段落前增加分页符
    • widow_control 孤行控制,控制页面的孤行和孤立行

3、添加表格

举例1:获取单元格、获取行、获取列、新增行、新增列

上代码:

from docx import Documentd = Document()
t = d.add_table(rows=6, cols=4, style="Table Grid")
# 通过行、列来确定单元格,索引从0开始
cell = t.cell(0, 0)
cell.text = "第1行第1列"
# 获取第2行
rows = t.rows[1]
for cell in rows.cells:cell.text = f"第2行第..列"
# 获取第3列
cols = t.columns[2]
for cell in cols.cells:cell.text = f"第3列第..行"
# 增加行、增加列
for cell in t.add_row().cells:cell.text = "新增行"
t.add_column(cell.width)
d.save("ttt.docx")

效果图:

代码解释:

方法名 描述
add_row() 新增1行
add_column(width) 新增1列,width列宽必须指定
add_table(rows, cols, style=None) 添加表格的方法,rows、cols为必填,style表示表格的样式,常用Table Grid,未赋值情况下表格为虚线,其他style样式如下:

  • style可以为:可以查看此博文https://blog.csdn.net/qq_45464895/article/details/123173742
  • 两种方式可以获取单元格
    • 方式一:通过t.cell(row, col)获取具体的单元格,索引从0开始
    • 方式二:通过rows = t.rows[0]columns = t.colums[0]获取行或列,然后通过获取到的行rows.cells[0]或列columns.cells[0]获取具体的单元格
  • 注意:设置单元格内容时,如果如果是int类型,需要转换成str:cell.text = str(i) i表示数字

举例2:首行设置背景色,合并单元格、表格文字居中

上代码:

from docx import Document
from docx.oxml.ns import nsdecls
from docx.oxml import parse_xml
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENTd = Document()
t = d.add_table(rows=5, cols=6, style="Table Grid")
# 首行设置背景色
rows = t.rows[0]
for cell in rows.cells:shading_elm = parse_xml(r'<w:shd {} w:fill="D9D9D9"/>'.format(nsdecls('w')))cell._tc.get_or_add_tcPr().append(shading_elm)
# 合并单元格
a = t.cell(1, 0)
a.text = '111'
b = t.cell(2, 1)
b.text = '222'
b.merge(a)
# 往合并单元格中写入
e = t.cell(3, 3)
f = t.cell(4, 4)
e.merge(f)
cell = t.cell(3, 4)
cell.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 水平居中
cell.paragraphs[0].add_run("合并单元格写入")
cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER  # 垂直居中
d.save("tttt.docx")

效果图:

代码解释:

  • 首行设置背景色:固定写法。fill="D9D9D9"可以在http://tool.chinaz.com/Tools/PageColor.aspx中找你需要的颜色进行替换
  • 合并后的单元格写入,可以使用它所包含的所有单元格来定位,比如:合并(3, 3)(4, 4)之间的单元格,那么可以通过(3, 3)(3, 4)(4, 3)(4, 4)定位这个合并后的单元格
  • 单元格中设置居中方式:WD_CELL_VERTICAL_ALIGNMENT可以设置为如下几种:
    • TOP 文本与单元格的上边框对齐
    • CENTER 文本与单元格的中心对齐
    • BOTTOM 文本与单元格的底部边框对齐
    cell = t.cell(3, 4)
    cell.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 水平居中
    cell.paragraphs[0].add_run("合并单元格写入")
    cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER  # 垂直居中
    

4、添加图片

上代码:

from docx import Document
from docx.shared import Pt, Inches
d = Document()
d.add_picture("test.png", Inches(5))
d.add_picture("test.png", Pt(200))
d.save("ppp.docx")

代码解释:

方法名 描述
add_picture(image_path_or_stream, width=None, height=None) 添加图片函数,如果没有指定width和height,会将原图添加到文档中。有指定则会按比例缩放。

5、添加页眉页脚

暂时没用到,需要可以参考下面的文章


参考文章:

  • 这个很全:https://blog.csdn.net/qq_45464895/article/details/123173742
  • https://blog.csdn.net/hihell/article/details/121966945
  • https://www.cnblogs.com/1gaoyu/p/12656003.html
  • https://www.5axxw.com/wiki/content/kbhv5m
  • https://www.5axxw.com/wiki/topic/l8oj0b
  • https://www.5axxw.com/wiki/content/qa5cih
  • https://www.cnblogs.com/wangyueping/p/16018206.html
  • https://blog.csdn.net/weixin_47383889/article/details/119847787
  • https://blog.csdn.net/u012034742/article/details/106022019/
  • https://blog.csdn.net/qq_27017791/article/details/108897521
  • http://tool.chinaz.com/Tools/PageColor.aspx
  • https://www.zhihu.com/question/511536143/answer/2313422603

python往word文档中写入表格、段落、标题、图片...(超级全)相关推荐

  1. Python3-word文档操作(五):利用python修改word文档中的表格数据

    1. 简介: 本篇继续学习python操作word文档的相关知识.本篇主要学习: 1)如何获取一个已经存在文档中的表格的内容: 2)如何修改一个已经存在文档中的表格的内容: 2. 获取word文档中的 ...

  2. python生成word文档的表格_2018-10-04 [日常]用Python读取word文档中的表格并比较

    演示如下. 两个简单的word文档, 各有一个表格: 读取文档中的表格到列表(为演示只对单列表格操作): import docx def 取表格(文件名): 文件 = docx.Document(文件 ...

  3. python读取word文档中的表格内容

    1. 使用到的库 :docx(python_docx‑0.8.10‑py2.py3‑none‑any.whl) 下载地址:https://download.lfd.uci.edu/pythonlibs ...

  4. 【python自动化办公(14)】利用python向Word文档中写入内容(format格式化中槽的使用和自动生成请假条小应用)

    添加文字内容 添加一级标题 doc.add_heading('标题名称', level = 标题等级) import os os.chdir('D:\\python_major\\auto_offic ...

  5. 办公室小姐姐的福利!用Python批量提取word文档中的表格和图片内容

    点上方"菜鸟学Python",选择"星标" 第491篇原创干货,第一时间送达 最近有许多小伙伴想要一些自动化办公的福利小程序,今天就满足大家的需求.日常的办公过 ...

  6. python合并word表格单元格_Python实战009:读取Word文档中的表格数据及表格合并问题解决...

    同事最近被安排整理资料,主要工作室将文档中的表格数据提取出来并整理层Excel表格供我们FII刀具商城进行资料维护.由于刀具的种类繁多且规格无数,所以要处理的数据量相当的庞大.人工核对整理既费时又费力 ...

  7. java poi操作word2007_java使用poi解析2007以上的word文档中的表格与图片

    项目中使用到了要解析word文档中的表格与图片,网上的2003的解析方式很多,2007以上的很少,我看了官网找了资料自己写了一个简单的解析方案,大家共同学习吧!有不对的地方希望大神指教! import ...

  8. WORD文档中的表格:自定义方式的批处理,增删行列和内容

    WORD文档中的表格:自定义方式的批处理,增删行列和内容: 大家有没有遇到需要处理WORD文档中的表格,表格多,需要大量的重复性工作: office提供了宏录制方式,可以编辑风格,内容,但是针对增删表 ...

  9. 用Aspose.Words 从Word文档中提取表格数据

    用Aspose.Words 从Word文档中提取表格数据 对于某些项目,开发人员需要从Word文档中提取数据并导出到数据库.最大的挑战是必须支持现有Word文档. 相同格式且带多个数据块的Word文档 ...

  10. C# 在word文档中复制表格并粘帖到下一页中

    C# 在word文档中复制表格并粘帖到下一页中 object oMissing = System.Reflection.Missing.Value;             Microsoft.Off ...

最新文章

  1. gps两点距离 php,PHP应用:PHP计算百度地图两个GPS坐标之间距离的方法
  2. IntelliJ IDEA 2019从入门到癫狂 图文教程!
  3. 了解下RDF 主要元素
  4. 我对汇编中进位和溢出的理解
  5. 风变Python3---if条件相关的学习
  6. JavaScript JSON 对象使用详解、JSON. parse()、JSON. stringify()
  7. 计算几何-求线段交点算法和代码(C++语言)
  8. unity 游戏版本更新插件
  9. CSS基础知识10-两种CSS布局
  10. 【云速建站】视频播放专题
  11. 三种近场通信的特点,以及未来近场通信技术的应用场景的分析和预测
  12. osgEarth的Rex引擎原理分析(二十五)地形瓦片大小尺寸和LOD的关系
  13. geany设置运行linux,Linux强大IDE——Geany配置说明
  14. PDF怎么编辑注释? 5 个免费好用的 PDF 注释器
  15. JNI/NDK开发指南(十一)——JNI异常处理
  16. word表格怎么缩小上下间距_word表格怎么调整行高间距拉不动
  17. python求列表list平均值的方法
  18. 图片转JPG格式怎么转换
  19. HM笔记_1_下载调试
  20. 抖音信号干扰特效怎么做?手把手教你AE制作

热门文章

  1. CTFshow misc入门 持续更新中
  2. OSChina 周三乱弹 —— 野生公交车正在河边喝水
  3. 例题 2-1 aabb 2-2 3n+1问题
  4. 【Codeforces】2015-2016 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2015) A Adjoin the Netwo
  5. 【学习笔记】汇编语言入门
  6. 计算机网络拨号,个人拨号上网宽带连接设置图文方法
  7. Redis 哨兵模式安装方法
  8. SPI全双工模式下收发字节的理解
  9. 电子锁c语言源程序数码管显示,基于C语言51单片机电子密码锁的设计与仿真
  10. 中国需要怎样的智慧城市联盟?中外41家联盟组织大起底