python学习-处理word文档

140 阅读6分钟

python学习-处理word文档

本文介绍 python 如何处理 Word 文档,包括依赖安装、读取和写入、段落处理、Run内容操作、文件样式管理、表格处理、插入图片、插入页眉和页脚。

供自己以后查漏补缺,也欢迎同道朋友交流学习。

引言

上面几篇文章,主要介绍了 Python 的基础语法、面向对象编程的用法、文件读写、异常处理、正则等基础知识。

文件读写我用的是 txt 文件格式,但在现实环境中,我们经常需要处理各种格式的文档,包括 Word 文档、 PDF 文档、 Excel 文档、 CSV 文档等等。

本章就主要介绍 Python 如何处理 Word 文档,包括依赖安装、读取和写入、段落处理、Run内容操作、文件样式管理、表格处理、插入图片、插入页眉和页脚。

安装依赖库

Python 提供了强大的库来处理 Word 文档,例如 python-docx,它允许你以编程方式创建、修改和读取 Word 文档。

pip install python-docx
# or
pip3 install python-docx

Python中的Word文档结构

文档的结构主要由以下几个核心组件构成:

word

  • Document(文档):这是整个 Word 文档的顶层容器。一个 Document 对象代表一个完整的 Word 文档。
  • Paragraph(段落):文档被分割成若干个段落,每个段落由一个或多个 Run 对象组成。段落是文档的基本构成单位,可以包含文本格式设置等。
  • Run(内容对象)Run 对象是具有相同格式设置的文本片段。当文本样式发生变化时,如字体大小颜色的改变,就会创建一个新的 Run 对象。

读取Word文档

word1

打开并读取文档段落

from docx import Document

# 打开文档
doc = Document('word-1.docx')

# 遍历段落
for para in doc.paragraphs:
  print(para.text)
  
# 输出:
# 我是文档标题
# 我是段落1,段落1,段落1
# 我是段落2,段落2,段落2
# 我是段落3,段落3,段落3

读取Run内容

# 遍历Run内容
for para in doc.paragraphs:
  for run in para.runs:
    print(run.text)

# 输出:
# 我是文档标题
# 我是段落1,
# 段落1,
# 段落1
# 我是段落2,
# 段落2,
# 段落2
# 我是段落3,
# 段落3,
# 段落3

提取元数据

Word 文档包含元数据,如作者标题等。

# 提取文档属性
core_properties = doc.core_properties
print("作者:", core_properties.author)
print("标题:", core_properties.title)
# 作者: 晨羽
# 标题: 

写入Word文档

创建并写入文档

创建新的 Word 文档,写入段落和 Run 内容,保存文档。

from docx import Document

# 创建文档实例
doc = Document()

# 添加标题
doc.add_heading('这是一个标题', level=1)

# 添加段落
p = doc.add_paragraph('这是一个段落。')

# 添加Run内容
run = p.add_run('段落的内容1')

# 保存文档
doc.save('word-2.docx')

设置文本格式

from docx.shared import Pt, RGBColor

# ...其他代码

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

生成后 word-2.docx 文件如下图:

word2

段落处理

创建和修改段落

使用 add_paragraph 方法在文档中添加新段落,修改段落文本可以使用 text 属性。

# ...其他代码
# 添加段落
p = doc.add_paragraph('这是一个新段落。')
p1 = doc.add_paragraph('段落1段落1段落1。')
p2 = doc.add_paragraph('段落2段落2段落2。')
p3 = doc.add_paragraph('段落3段落3段落3。')

# 修改段落文本
p.text = '这是修改后的段落文本。'

设置对齐方式

使用 paragraph.alignment 属性设置对齐方式,可选值有:

  • 左对齐WD_PARAGRAPH_ALIGNMENT.LEFT
  • 居中对齐WD_PARAGRAPH_ALIGNMENT.CENTER
  • 右对齐WD_PARAGRAPH_ALIGNMENT.RIGHT
  • 俩端对齐WD_PARAGRAPH_ALIGNMENT.JUSTIFY
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
# ...其他代码

# 设置段落对齐方式: 居中
p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

段落缩进

缩进格式如下:

  • 首行缩减:使用 paragraph_format.first_line_indent
  • 悬挂缩进:使用 paragraph_format.hanging_indent
  • 左缩进:使用 paragraph_format.left_indent
  • 右缩进:使用 paragraph_format.right_indent
from docx.shared import Inches, Pt
# ...其他代码

# 设置缩进
# 首行缩进0.5英寸
p2.paragraph_format.first_line_indent = Inches(0.5)
# 左缩进1英寸
p3.paragraph_format.left_indent = Inches(1)

管理段落样式

创建自定义样式并应用到段落:

from docx.enum.style import WD_STYLE_TYPE
# ...其他代码

style = doc.styles.add_style('My Style', WD_STYLE_TYPE.PARAGRAPH)
style.base_style = doc.styles['Normal']
style.font.size = Pt(14)
style.paragraph_format.space_after = Pt(6)

p.style = style

生成后 word-3.docx 文件如下图:

word3

Run内容操作

添加和修改Run内容

使用 add_run 方法在段落末尾添加一个新的 Run 内容,修改 Run 内容可以使用 text 属性,设置字体内容使用 font 属性。

#...其他代码
from docx import Document
from docx.shared import Pt, RGBColor

# 创建文档实例
doc = Document()

# 添加段落
p = doc.add_paragraph('这是一个段落。')

# 添加Run内容
run = p.add_run('段落的内容1')

# 替换Run
run.text = ',替换后的Run文本,'

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

# 保存文档
doc.save('word-4.docx')

插入和删除Run内容

使用 insert_paragraph_before 在段落中的特定位置插入 Run 内容,使用 clear 方法删除 Run 内容。

# 插入Run
run1 = p.insert_paragraph_before('在前面插入的Run文本')

# 删除Run
run1.clear()

生成后 word-4.docx 文件如下图:

word4

表格处理

创建表格

使用 add_table 方法在文档中添加表格。

from docx import Document

# 创建文档实例
doc = Document()

# 创建表格
table = doc.add_table(rows=2, cols=2)
# 添加内容
row = table.rows[0]
row.cells[0].text = '姓名'
row.cells[1].text = '年龄'
row = table.rows[1]
row.cells[0].text = '张三'
row.cells[1].text = '18'

# 保存文档
doc.save('word-5.docx')

添加和删除行、列

# 添加表格行
row = table.add_row()
row.cells[0].text = '李四'
row.cells[1].text = '20'

# 删除第一行
# row._element.getparent().remove(row._element)
# row._tcPr = None  # 清除引用

# 添加列
table.add_column(width=1000000)  # 宽度单位为EMU(English Metric Units)
table.rows[0].cells[2].text = '性别'

# 删除列
# for row in table.rows:
#   cell = row.cells[-1]
#   cell._element.getparent().remove(cell._element)
#   del cell

合并单元格

# 合并单元格
table.cell(1, 2).merge(table.cell(2, 2))
table.cell(1, 2).text = '男'

生成后 word-5.docx 文件如下图:

word5

图片插入

使用 add_picture 方法插入图片。需要提供图片的路径和图片的宽度和高度:

from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

# 创建文档实例
doc = Document()

# 创建段落
p = doc.add_paragraph()
run = p.add_run()

# 插入图片
run.add_picture('img1.jpeg', width=Inches(3), height=Inches(2))

# 调整图片位置
p.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中对齐

# 保存文档
doc.save('word-6.docx')

生成后 word-6.docx 文件如下图:

word6

插入页眉和页脚

  • 使用 section 对象的 header 属性来访问或创建页眉
  • 使用 section 对象的 footer 属性来访问或创建页脚
from docx import Document

# 创建文档实例
doc = Document()

# 添加页眉
header = doc.sections[0].header
header_paragraph = header.paragraphs[0]
header_run = header_paragraph.add_run('这是页眉')

# 添加页脚
footer = doc.sections[0].footer
footer_paragraph = footer.paragraphs[0]
footer_run = footer_paragraph.add_run('这是页脚')

# 保存文档
doc.save('word-7.docx')

生成后 word-7.docx 文件如下图:

word7

word8

python学习专栏系列

练习代码库地址

python-study