python-docx神器操作word文档

1 安装

pip 来安装:

$ pip install python-docx

2 简单使用

from docx import Document

# 创建word文档
document = Document()
# 添加段落
paragraph = document.add_paragraph('Lorem ipsum dolor sit amet.')
# 插入段落
prior_paragraph = paragraph.insert_paragraph_before('Lorem ipsum')

# 保存文件
document.save(r"D:\test.docx")

3 python-docx入门

文档

3.1 添加标题

默认情况下添加的标题是最高一级的,即一级标题,通过参数 level 设定,范围是 1 ~ 9(也有 0 级别,表示的是段落标题)

  • Document
  • add_heading
from docx import Document

# 创建word文档
document = Document()

# 添加一级标题
document.add_heading('我是一级标题')
# 添加二级标题
document.add_heading('我是二级标题', level=2)
# 添加段落标题
document.add_heading('我是段落标题', level=0)
# 保存文件
document.save('./test.docx')

python 将word按标题进行拆分 python修改word的二级标题_python 将word按标题进行拆分

3.2 添加段落

如何在word文档中添加段落呢?

  • Document
  • add_paragraph
  • insert_paragraph_before
from docx import Document

# 创建word文档
document = Document()

# 添加段落
document.add_paragraph('添加一处段落')
# 添加段落
p0 = document.add_paragraph('再次添加一处段落')
# 在 p0段落之前 再次添加段落
p0.insert_paragraph_before("在 p0 段落之前 添加段落")
# 保存
document.save('./test1.docx')

python 将word按标题进行拆分 python修改word的二级标题_python 将word按标题进行拆分_02

3.3 添加换页

如果一个段落不满一页,需要分页时,可以插入一个分页符,直接调用会将分页符插入到最后一个段落之后

  • Document
  • add_page_break: 直接添加一页
  • 通过段落添加一页
  • p1 = document.add_paragraph("独占一页")
  • p1.runs[-1].add_break(WD_BREAK.PAGE)
from docx import Document
from docx.enum.text import WD_BREAK

# 创建word文档
document = Document()

# 在当前文档最后添加一页
document.add_page_break()

# 添加段落
p1 = document.add_paragraph("独占一页")
# 插入段落
p1.insert_paragraph_before("insert_paragraph_before")
# 在 p1段落后 添加一页
p1.runs[-1].add_break(WD_BREAK.PAGE)

3.4 表格操作

Word 文档中经常会用到表格,python-docx 如何添加和操作表格呢?

  • Document
  • add_table
  • cell 单元格 参数有两个,实例:cell(0, 1) 获取第1行第2列的单元格
  • rows 获取
  • cells
from docx import Document

# 创建word文档
document = Document()

# 添加一个 2×2 表格
table = document.add_table(rows=2, cols=2)

# 获取第一行第二列单元格
cell = table.cell(0, 1)
# 设置单元格文本
cell.text = '我是第 1 行 第 2 列单元格'

# 表格的行
row = table.rows[1]
row.cells[0].text = '我是第 2 行 第 1 列单元格'
row.cells[1].text = '我是第 2 行 第 2 列单元格'

# 增加行
row = table.add_row()

案例:

# 表格数据
items = (
    (7, '1024', '手机'),
    (3, '2042', '笔记本'),
    (1, '1288', '台式机'),
)

# 添加一个表格
table = document.add_table(rows=1, cols=3)

# 设置表格标题
heading_cells = table.rows[0].cells
heading_cells[0].text = '数量'
heading_cells[1].text = '编码'
heading_cells[2].text = '描述'

# 将数据填入表格
for item in items:
    # 添加行
    cells = table.add_row().cells
    cells[0].text = str(item[0])
    cells[1].text = item[1]
    cells[2].text = item[2]

python 将word按标题进行拆分 python修改word的二级标题_缩进_03

3.5 添加图片

如何插入图片到word文档之中呢?

  • Document
  • add_picture
# -*- coding: utf-8 -*-
from docx import Document
from docx.shared import Cm

# 创建word文档
document = Document()

# 第一种: 插入图片 原始尺寸
document.add_picture('./01.jpeg')
# 第二种:插入图片 Cm 厘米
document.add_picture('./01.jpeg', width=Cm(15))

# 第三种:等比例插入图片  (推荐使用)
pic = document.add_picture('./01.jpeg')
p_width = document.sections[0].page_width  # word页的总宽度
left_margin = document.sections[0].left_margin  # word页的左边距
rate = (p_width - left_margin * 2) / pic.width  # 计算缩放比例
pic.height = int(pic.height * rate)
pic.width = int(pic.width * rate)

# 保存
document.save('./test1.docx')

python 将word按标题进行拆分 python修改word的二级标题_缩进_04

docx库除了提供了厘米(Cm)外,还有英寸(Inches)

3.6 样式

段落样式

段落样式包括:对齐、列表样式、行间距、缩进、背景色等,可以在添加段落时设定,也可以在添加之后设置

3.6.1 列表样式

from docx import Document

# 创建word文档
document = Document()

# 添加一个段落,设置为无序列表样式
p1 = document.add_paragraph('截至2022年,中国糖尿病患者近1.3亿。')
p2 = document.add_paragraph('截至2022年,中国糖尿病患者近1.3亿。')
p1.style = 'List Bullet'
p2.style = 'List Bullet'

# 或者 直接传入样式参数
document.add_paragraph('截至2022年,中国糖尿病患者近1.3亿。', style='List Bullet')
document.add_paragraph('截至2022年,中国糖尿病患者近1.3亿。', style='List Bullet')


# 保存
document.save('./test2.docx')

python 将word按标题进行拆分 python修改word的二级标题_List_05

3.6 2 段落格式

行间距、缩进等

from docx import Document
from docx.shared import Pt

# 创建word文档
document = Document()

# 添加段落
p = document.add_paragraph('截至2022年,中国糖尿病患者近1.3亿。')
pf = p.paragraph_format
# 左缩进
# pf.left_indent = Pt(20)
# 右缩进
# pf.right_indent = Pt(20)
# 首行缩进
pf.first_line_indent = Pt(20)
# 行间距
pf.line_spacing = 1

# 保存
document.save('./test2.docx')

3.6.2 文字样式

设置 字体/字号/颜色,加粗/下划线斜体等

# -*- coding: utf-8 -*-
from docx import Document
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn

# 创建word文档
document = Document()

# 添加一个段落,设置为无序列表样式
p = document.add_paragraph('截至2022年,中国糖尿病患者近1.3亿。')
pf = p.paragraph_format
# 左缩进
# pf.left_indent = Pt(20)
# 右缩进
# pf.right_indent = Pt(20)
# 首行缩进
pf.first_line_indent = Pt(20)
# 行间距
pf.line_spacing = 1

# 在段落中追加
run = p.add_run('中国糖尿病患病原因受生活方式、老龄化、城市化、家族遗传等多种因素影响。')
# 设置字号
run.font.size = Pt(20)
# 设置字体
run.font.name = '微软雅黑'
run.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
# 设置字体颜色
run.font.color.rgb = RGBColor(255, 0, 0)

# 在段落中追加
run1 = p.add_run('同时,糖尿病患者趋向年轻化。')
# 设置字号
run1.font.size = Pt(10)
# 设置字体
run1.font.name = '微软雅黑'
run1.element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
# 设置字体颜色
run1.font.color.rgb = RGBColor(40, 40, 40)
# 加粗
run1.font.bold = True
# 下划线
run1.font.underline = True
# 斜体
run1.font.italic = True

# 保存
document.save('./test2.docx')

python 将word按标题进行拆分 python修改word的二级标题_插入图片_06

3.7 样式应用

如何给word文档设置全局的样式呢, 添加标题、段落等使用全局的样式类型?

3.7.1 添加样式

方式一: 自定义一个样式

# -*- coding: utf-8 -*-
from docx.document import Document as Docx
from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt
from docx.oxml.ns import qn

# 创建文档
document: Docx = Document()
print(type(document))

# 添加样式
styles = document.styles  # 当前文档的样式
p_style = styles.add_style('p_style', WD_STYLE_TYPE.PARAGRAPH)  # 添加一个样式
# 设置字体
p_font = p_style.font
p_font.name = '微软雅黑'
p_style._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
# 设置字体大小
p_font.size = Pt(18)

# 添加段落  使用定义的样式
document.add_paragraph('这是一个段落', style=p_style.name)

document.save('./test3.docx')

方式二: 修改默认的样式

# -*- coding: utf-8 -*-
import docx.document as Docx
from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt
from docx.oxml.ns import qn

# 创建文档
document: Docx = Document()

# 添加样式
styles = document.styles
styles['Normal'].font.name = '微软雅黑'
styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
styles['Normal'].font.size = Pt(18)

# 添加段落
document.add_paragraph('这是一个段落')

document.save('./test4.docx')

3.7.2 定义段落格式

from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Inches, Pt

document = Document()

style = document.styles.add_style('Indent', WD_STYLE_TYPE.PARAGRAPH)
paragraph_format = style.paragraph_format
paragraph_format.left_indent = Inches(0.25)
paragraph_format.first_line_indent = Inches(-0.25)
paragraph_format.space_before = Pt(12)
paragraph_format.widow_control = True

3.7.3 设置页眉页脚

# -*- coding: utf-8 -*-
from docx.document import Document as Docx
from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt
from docx.oxml.ns import qn

# 创建文档
document: Docx = Document()

# 添加样式
styles = document.styles
styles['Normal'].font.name = '微软雅黑'
styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑')
styles['Normal'].font.size = Pt(18)

# 页眉页脚设置
section = document.sections[0]
header = section.header
header.paragraphs[0].text = '设置页眉信息'
header.paragraphs[0].style.font.size = Pt(10)
footer = section.footer
footer.paragraphs[0].text = '设置页脚信息'
footer.paragraphs[0].style.font.size = Pt(10)

# 添加段落
document.add_paragraph('这是一个段落')

document.save('./test4.docx')

3.7.4 段落对齐方式

属性

说明

LEFT

左对齐

CENTER

居中

RIGHT

右对齐

JUSTIFY

自由调整

DISTRIBUTE

占满整个段落的宽度

JUSTIFY_MED

以中等字符压缩比调整

JUSTIFY_HI

具有高字符压缩比

JUSTIFY_LOW

以较低的字符压缩比进行调整

THAI_JUSTIFY

根据泰语格式布局对齐

代码示例

from docx.enum.text import WD_PARAGRAPH_ALIGNMENT  # 或者导入WD_ALIGN_PARAGRAPH

paragraph = document.add_paragraph()
paragraph.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER