python-docx - 1

发布时间 2023-05-20 11:15:39作者: 叁只小羊

python-docx 用于创建和更新Word文件的python库

1. 安装

pip3 install python-docx -i https://mirrors.aliyun.com/pypi/simple

2. 创建与保存文件

#导入Document
from docx import Document

# 创建一个新文档
doc = Document()
print(type(doc))  # <class 'docx.document.Document'>

# doc=Document("file.docx") 可以打开一个新文档

# 保存文件
doc.save("hello.docx")

3. 标题

from docx import Document

doc = Document()
# 添加标题
# text=内容, level=级别 (1-9)
heading = doc.add_heading(text="1级标题", level=1)
# 返回的是一个段落,说明标题也是段落的一种
print(type(heading)) # <class 'docx.text.paragraph.Paragraph'>

for i in range(2, 10):
    doc.add_heading(text=f"{i}级标题", level=i)
    
doc.save("hello.docx")

4. 段落

4.1 添加段落

from docx import Document

doc = Document()

# 在文档尾添加一个段落,返回这个段落的引用
p1 = doc.add_paragraph(text="第一段")
p2 = doc.add_paragraph(text="第二段")
# 插入段落
p1_5 = p2.insert_paragraph_before("第二段前插入一段")

doc.save("hello.docx")

4.2 指定段落样式

4.2.1 无序列表

from docx import Document

doc = Document()
doc.add_paragraph("三国演义", style="List Bullet")
doc.add_paragraph("红楼梦", style="List Bullet")
p = doc.add_paragraph("西游记")
p.style = "List Bullet"
doc.save("hello.docx")

List Bullet生成一个无序列表。

4.2.2 有序列表

from docx import Document

doc = Document()
for p in ["红楼梦", "三国演义", "西游记", "水浒传"]:
    doc.add_paragraph(p, style="List Number")
doc.save("hello.docx")

List Number 生成一个有序列表。

4.3.3 添加一个新样式,并应用这个样式

from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt, RGBColor

doc = Document()
# 添加一个段落样式,在word样式中会多出一个my_style的样式
style = doc.styles.add_style('my_style', WD_STYLE_TYPE.PARAGRAPH)
# 设置样式的:字号,字体,颜色
style.font.size = Pt(18)
style.font.name = "Showcard Gothic"
style.font.color.rgb = RGBColor(255, 0, 0)

# 创建并应用段落样式
doc.add_paragraph("Hello world!", style=style)
doc.save("hello.docx")

4.3 段落的对齐方式

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

doc = Document()
p1 = doc.add_paragraph("hello")
# 左对齐
p1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT

p2 = doc.add_paragraph("hello")
# 居中对齐
p2.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
doc.save("hello.docx")

对齐方式有:

对齐方式 说明
LEFT 0 左对齐
RIGHT 1 右对齐
CENTER 2 居中对齐
JUSTIFY 3 两端对齐
DISTRIBUTE 4 分散对齐

4.4 段落的缩进

from docx import Document
from docx.shared import Cm

text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'

doc = Document()
p1 = doc.add_paragraph(text)
# 左缩进二厘米
p1.paragraph_format.left_indent = Cm(2)

doc.save("hello.docx")

缩进的方式有:

缩进 说明
left_indent 左缩进
right_indent 右缩进
first_line_indent 首行缩进

常用单位:

  • Cm厘米
  • Pt 磅
  • Mm 毫米
  • Inches 英寸

4.4.1 悬挂缩进在哪里?

首先缩进支持负值,就相当于悬挂缩进了,如:

from docx import Document
from docx.shared import Cm

text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'

doc = Document()
p1 = doc.add_paragraph(text)
# 缩进二厘米(整体向右移动2)
p1.paragraph_format.left_indent = Cm(2)
# 首先缩进-2厘米,首先向左移动2厘米,整体效果就是悬挂缩进
p1.paragraph_format.first_line_indent = Cm(-2)

doc.save("hello.docx")

4.4.2 如何首行缩进2个字符

from docx import Document
from docx.shared import Cm, Pt

text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'

doc = Document()
p1 = doc.add_paragraph(text)
# 先设置字号(三号),之后获取字体对应字号的大小*2 即可
p1.style.font.size = Pt(16)
p1.paragraph_format.first_line_indent = p1.style.font.size * 2
doc.save("hello.docx")

4.5 段落间距(段前,段后)

from docx import Document
from docx.shared import Cm, Pt

text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'

doc = Document()
for i in range(5):
    p1 = doc.add_paragraph(text)
    # 段前
    p1.paragraph_format.space_before = Pt(20)
    # 段后
    p1.paragraph_format.space_after = Pt(10)
doc.save("hello.docx")

4.6 行距

from docx import Document
from docx.shared import Cm, Pt

text = '燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:如今又到了哪里呢?'

doc = Document()
p = doc.add_paragraph(text)
# 1.5倍行距
p.paragraph_format.line_spacing = 1.5

p = doc.add_paragraph(text)
# 24磅行距
p.paragraph_format.line_spacing = Pt(24)
doc.save("hello.docx")

4.7 分页属性

用于控制段落在页面边界附近的行为

  • keep_together 段中不分页

  • keep_with_next 与下段同页

  • page_break_before 段前分页

  • widow_control 孤行控制

# 这四个属性可以设置为True, False, None
p.paragraph_format.widow_control = True

5. 添加硬分页

当一页没满,希望在另一页继续,则可以添加一个分页符。

from docx import Document

doc = Document()
for i in range(1, 5):
    doc.add_paragraph(f"第{i}页")
    doc.add_page_break()
doc.save("hello.docx")