python-docx

光看视频感觉看完就忘记了,就把代码跑一下顺便写点笔记
视频
整理这个感觉是有点磨时间,但是觉得比较有效率,也方便以后忘记了看(不难理解,就是需要记忆的东西有点多),直接来搬代码多香

python-docx库的安装

1、找到pip3.exe所在的文件夹,复制路径

2、按Win+R,输入CMD确定

3、进入后,先输入cd 路径 回车

4、输入 pip3 install python-docx 回车

5、如果在终端通过pip装好包以后,在pycharm中导入包时,依然会报错,解决方法

文件.paragraphs 得到的是一个列表,包含了每个段落的实例,可以索引、切片、遍历

from 从 docx这个文件中,导入一个叫Document的一个东西,Document是文档的意思

文件 = Document() 可以理解为 Document就是一个类,这个操作也就是实例化的过程,生成对象为:文件

from docx import Document
#Document('所要打开文件的地址,注意:地址一般是用\,记得换成/')
文件 = Document('D:/练习.docx')
#返回文档中每个段落集合,是一个列表,可以通过索引获取
print(文件.paragraphs)
print(文件.paragraphs[0])
print(文件.paragraphs[0:2])

这样输出得到的是一串 串编码,要得到文字内容,需要进行其他操作

from docx import Document
文件 = Document('D:/练习.docx')
#遍历文件的每一个段落,通过段落.text得到该段落文字的内容
for 段落 in 文件.paragraphs:
 print(段落.text)

每一段文字根据其格式不同还可分成多个文字块

段落.runs 得到一个列表,包含了每个文字块,可索引、切片、遍历
文字.text 得到该文字块的文字内容

from docx import Document
文件 = Document('D:/练习.docx')
段落 = 文件.paragraphs[0]
块 = 段落.runs
#遍历第一段的文字块
for 文字 in 块:
 print(文字.text)

应用实例

在练习.docx中搜索某个字符出现的次数,以逗号为例

from docx import Document
文件 = Document('D:/练习.docx')
计数 = 0
for 段落 in 文件.paragraphs:
 if ',' in 段落.text:
    计数 += 1
print(计数)

二 添加

添加标题

文件.save('文件保存路径')

from docx import Document
文件 = Document('D:/练习.docx')
文件.add_heading("我是一级标题",level=1)
文件.add_heading("我是二级标题",level=2)
文件.save('D:/练习2.docx')

在使用该方法添加标题前,要先在要打开的练习.docx文件中添加标题样式,具体方法

下面操作与上面类似,不加图片了(懒)

添加正文

from docx import Document
文件 = Document('D:/练习.docx')
文件.add_paragraph("我是正文1234567")
文件.save('D:/练习2.docx')

添加分页符

from docx import Document
文件 = Document('D:/练习.docx')
文件.add_page_break()
#由于上一句添加了分页符,该句添加的正文将从下一页开始
文件.add_paragraph("我是正文1234567")
文件.save('D:/练习2.docx')

添加文字段

from docx import Document
文件 = Document('D:/练习.docx')
a = 文件.add_paragraph('我是正文在我后面添加的文字会被设置格式:')
#add_run("添加的文字段")
a.add_run('加粗').bold = True
a.add_run('普通')
a.add_run('斜体').italic = True
文件.save('D:/练习2.docx')

添加段落在新的一段

from docx import Document
文件 = Document('D:/练习.docx')
文件.add_paragraph('123455666')
文件.save('D:/练习2.docx')

添加段落在指定段落处

from docx import Document
文件 = Document('D:/练习.docx')
段落 = 文件.paragraphs[1] # 获取第二个段落
段落.insert_paragraph_before('12345566') # 在第二个段落处插入,既 12345566 成为第二段
文件.save('D:/练习2.docx')

添加图片

文件.add_picture(图片地址, width = 宽度, height = 高度)

宽度和高度的参数不输入也可,不输入时按图片原大小插入,但是建议输入参数

宽度跟高度可以只给一个,另外一个会根据比例自动计算

在输入高度的时候,需要用到一个新的引用:from docx.shared import Cm

from docx.shared import Cm
from docx import Document
文件 = Document('D:/练习.docx')
文件.add_picture('C:/Users/Lenovo/Pictures/Saved Pictures/2.png', width = Cm(10), height = Cm(8)) # Cm是厘米
文件.save('D:/练习2.docx')

添加图片在指定表的单元格

前提:word文档中要有表格,否则报错

from docx.shared import Cm
from docx import Document
文件 = Document('D:/练习.docx')
#在word文档的第一个表格的第1行第1列的单元格的第一段下插入图片,每个单元格也有多个段落
run = 文件.tables[0].cell(0,0).paragraphs[0].add_run()
run.add_picture('C:/Users/Lenovo/Pictures/Saved Pictures/2.png', width = Cm(5), height = Cm(3)) # Cm是厘米
文件.save('D:/练习2.docx')

添加表格

文件.add_table(rows = 多少行, cols = 多少列)

from docx import Document
文件 = Document('D:/练习.docx')
#添加一个5行3列的表格,添加的表格无边框和底纹,看起来不明显
表 = 文件.add_table(rows = 5, cols = 3)
文件.save('D:/练习2.docx')

为添加的表格的每个单元格赋值,采用遍历表格每个单元格的方法

from docx import Document
文件 = Document('D:/练习.docx')
列表=[['姓名','性别','年龄'],
['小华','男',20],
['小丽','女',33],
['小龙','男',80],
['小明','男',127]]
r = 5
c = 3
表 = 文件.add_table(rows = r, cols = c)
for 行号 in range(r):
    单元格 = 表.rows[行号].cells
    for 列号 in range(c):
        单元格[列号].text = str(列表[行号][列号])
文件.save('D:/练习2.docx')

添加表格行和列

from docx import Document
from docx.shared import Cm
文件 = Document('D:/练习.docx')
文件.tables[0].add_row() # 表格最下方增加一行
文件.tables[0].add_column(Cm(5)) # 表格最右侧增加一列,一定要写列宽
文件.save('D:/练习2.docx')

三 对图片的操作

以图1为基准对图二进行大小调整,调整后大小一致

shape 对象代表文档中的图形对象,Inline_shape 代表文档中的嵌入式图形对象

from docx import Document
from docx.shared import Cm
文件 = Document('D:/练习.docx')
图片1 = 文件.paragraphs[1].add_run().add_picture('C:/Users/Lenovo/Pictures/Saved Pictures/2.png')  # 在文档第2个段落里添加图片2
图片2 = 文件.paragraphs[2].add_run().add_picture('C:/Users/Lenovo/Pictures/Saved Pictures/1.jpg',width=Cm(5)) # 在文档第3个段落里添加图片1
h=文件.inline_shapes[1].height / 文件.inline_shapes[0].height # 当前图片高度比例
w=文件.inline_shapes[1].width / 文件.inline_shapes[0].width # 当前图片宽度比例
图片1.height = int(文件.inline_shapes[0].height * h) # 按照比例设置图片高度
图片1.width = int(文件.inline_shapes[0].width * w) # 按照比例设置图片宽度
文件.save('D:/练习2.docx')

按照固定比例设置图像大小

from docx import Document
from docx.shared import Cm
文件 = Document('D:/练习.docx')
图片= 文件.paragraphs[1].add_run().add_picture('C:/Users/Lenovo/Pictures/Saved Pictures/2.png')  # 在文档第2个段落里添加图片
#按10:1的比例缩小图片
图片.height=int(文件.inline_shapes[0].height*0.1)
图片.width=int(文件.inline_shapes[0].width*0.1)
文件.save('D:/练习2.docx')

按照锁定比例设置图像大小

固定比例的另外一种常用的方式就是“锁定比例”。所谓锁定比例就是当设置高度和宽度中的任何一个时,另外一个也会按照相同的比例进行设置。一般经过读取原始图片的高度或者宽度,设置新的值,计算比例,最后将比例设置宽度或者高度。

from docx import Document
from docx.shared import Cm
文件 = Document('D:/练习.docx')
图片= 文件.paragraphs[1].add_run().add_picture('C:/Users/Lenovo/Pictures/Saved Pictures/2.png')  # 在文档第2个段落里添加图片
高度 = 图片.height # 读取图片原始大小高度
图片.height = Cm(5) # 设置图片高度为5cm
比例 = 图片.height / 高度 # 计算图片比例,新设定的高度除以原始高度
图片.width = int(文件.inline_shapes[0].width * 比例) # 按照比例设置图片宽度
文件.save('D:/练习2.docx')

图片的定位的删除,文字也可通过该方式删除一段

图像是通过run对象的add_picture()来添加的,而run对象是段落的一部分,所以通过删除段落可以删除图像。

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Cm
文件 = Document('D:/练习.docx')
图片= 文件.paragraphs[1].add_run().add_picture('C:/Users/Lenovo/Pictures/Saved Pictures/2.png',width=Cm(5))  # 在文档第2个段落里添加图片
段落 = 文件.paragraphs[1] # 获取文档中的第2个段落对象
print('删除前图形图像的数量:', len(文件.inline_shapes)) # 删除前图片的数量
段落.clear() # 删除段落
print('删除后图形图像的数量:', len(文件.inline_shapes)) # 删除后图片的数
文件.save('D:/练习2.docx')

图片的对齐方式

在插入图片时,经常使用run.add_picture()方法,本质上仍然是在段落中添加,所以,改变段落对齐对齐方式,效果也作用到图片上,这个时候的图片是单独一 个段落。

段落对齐包from docx.enum.text import WD_PARAGRAPH_ALIGNMENT

5种对齐方式

  1. WD_PARAGRAPH_ALIGNMENT.LEFT # 左对齐
  2. WD_PARAGRAPH_ALIGNMENT.CENTER # 居中对齐
  3. WD_PARAGRAPH_ALIGNMENT.RIGHT # 右对齐
  4. WD_PARAGRAPH_ALIGNMENT.JUSTIFY # 两端对齐
  5. WD_PARAGRAPH_ALIGNMENT.DISTRIBUTE # 分散对齐
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT # 导入段落对齐包
from docx import Document
from docx.shared import Cm
文件 = Document('D:/练习.docx')
图片 = 文件.paragraphs[1].add_run().add_picture('C:/Users/Lenovo/Pictures/Saved Pictures/2.png',width=Cm(5)) # 在文档第2个段落里添加图片
文件.paragraphs[1].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 设置文档中的第2个段落右对齐
文件.save('D:/练习2.docx')

四 对表格的操作

查看表的行列数

from docx import Document
文件 = Document('D:/练习.docx')
print(f'现在第1个表的行是{len(文件.tables[0].rows)},列是{len(文件.tables[0].columns)}')

表格行和列的定位

table.rows和table.columns两个属性获取行和列的的总对象,然后使用索引获取指定的行或者列对象。获取表格中的第2行和第2列代码如下:

 row = table.rows[1] 

column = table.columns[1]

删除表格中的行、列

在表格中虽然单元格可以从column中的cells中来遍历,但是单元格是按行存储的,这点将在删除列的部分重点说明

一、删除表格中的行
from docx import Document
文件 = Document('D:/练习.docx')
表1 = 文件.tables[0] # 获取第一个表格
print(f'表1的共{len(表1.rows)}行,{len(表1.columns)}列')
行 = 表1.rows[1] # 获取表格中的第2行
行._element.getparent().remove(行._element) # 删除行
print(f'删除表格中的第2行后,表1共{len(表1.rows)}行,{len(表1.columns)}列')
文件.save('D:/练习2.docx')
二、删除表的中列

列的删除则不能像删除行那样使用对应的remove()函数,因为在_Column中没有定义_element,但可以采用单元格进行删除。

from docx import Document
文件 = Document('D:/练习.docx')
表1 = 文件.tables[0] # 获取第一个表格
print(f'表1的共{len(表1.rows)}行,{len(表1.columns)}列')
列 = 表1.table.columns[1] # 获取表1中第2列
for 单元格 in 列.cells: # 遍历列中的单元格
 单元格._element.getparent().remove(单元格._element) # 删除第2列的单元格
print(f'删除表格中的第2行后,表1共{len(表1.rows)}行,{len(表1.columns)}列')
文件.save('D:/练习2.docx')

通过cell的remove()方法可以删除表格的列,但是由于表格中的cell是按行存储,每行存储的cell的数量并没有变化,所以当删除单元格后,后续的单元格会补 上。那么此时表格的存储形式将不是WORD文档表现出的效果

表格仍然按照每行6个元素存储,表格仍然是4行6列,但有一行是空行

删除一整个表
from docx import Document
文件 = Document('D:/练习.docx')
print(f'文件中表格总数:{len(文件.tables)}个')
表 = 文件.tables[1] # 获取第二个表格
表._element.getparent().remove(表._element) # 删除表格
print(f'删除后的表格总数:{len(文件.tables)}个')

文件.save('D:/练习2.docx')

设置单元格的值

表格中单元格的值有两种赋值方式,一种是直接为cell.text属性赋值来实现,另外一种是通过获取或者添加单元格中的段落,然后使用段落中的text属性赋值实现

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
文件 = Document('D:/练习.docx')
# 方法1
表 = 文件.tables[0]
表.cell(0, 0).text = 'abc' # 为表格的(0,0)位置单元格赋值
# 方法2
段落 = 表.cell(0, 1).paragraphs[0] # 获取表格(0,1)位置单元格中的段落
段落.text = 'ABC'
段落 = 表.cell(0, 1).add_paragraph('第二个段落居中')
段落.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置段落居中
文件.save('D:/练习2.docx')

注:第一种赋值方式,只能更改单元格的值,无法设置单元格中数据的样式,并且整个单元格只能是一个段落;而第二种赋值方式,使用了段落,在单元格赋值的基 础上还能增加新的段落,并设置段落的样式和字体的样式

表格的录入

在表格中使用table.cell(col_index, row_indelx)来定位单元格,使用cell.text属性设置单元格的值。新建表格并将第一行设置为表头,从第二行开始作为数据的 开始行

一、简单直接的方式进入录入

这种录入方式要为每个单元格单独写入使用代码,适合对表格数据样式重复性低的情形,代码量大,可移植性差。

from docx import Document
文件=Document('D:/练习.docx')
表 = 文件.add_table(2, 4)
表.cell(0, 0).text = '序号'
表.cell(0, 1).text = '姓名'
表.cell(0, 2).text = '年龄'
表.cell(0, 3).text = '身高'
# 表格赋值,将第二行作为数据输入第一行
表.cell(1, 0).text = '1'
表.cell(1, 1).text = '小华'
表.cell(1, 2).text = '20'
表.cell(1, 3).text = '178'

文件.save('D:/练习2.docx')
二、按行录入

这种方式将数据的录入以行为单位进行录入。在对数据录入时,先获取行中cells对象,遍历每个cell,并通过cell.text赋值,录入数据

数据 = [['序号', '姓名', '年龄', '身高'], ['1', '小华', '20', '178'], ['2', '小丽', '33', '165']]
文件 = Document('D:/练习.docx') # 新建docx文档
表 = 文件.add_table(3, 4)
表头 = 表.rows[0].cells
for 列 in range(4):
 表头[列].text = 数据[0][列] # ['序号', '姓名', '年龄', '身高']里面的第几个
# 录入数据
 for 行 in range(1, 3):
    表数据 = 表.rows[行].cells
    for 列 in range(4): # 遍历列
         表数据[列].text = 数据[行][列] # 数据中每一行是一个列表,每一列是一个元素
文件.save('D:/练习2.docx')
三、从表格中导入数据后按行录入
from docx import Document
#需要安装pandas 和 openpyxl 2个库
import pandas as pd
数据 = pd.read_excel('D:/表格.xlsx',header=None)
文件 = Document('D:/练习.docx')
表 = 文件.add_table(3, 4)
for 行 in range(3):
    for 列 in range(4):
        print(行,列) # 可以查看表格输出结果
 表.cell(行,列).text = str(数据.iloc[行,列]) # 由于里面有数据型的,需要强制转字符
文件.save('D:/练习2.docx')

删除单元格数据

单元格数据的删除从本质上来说同赋值是一样的,只不过赋值为空字符串。同样也有两种方式来实现删除单元格数据,一种是直接cell.text赋值为空,另外一种 能是使用段落,将段落的text属性赋值为空

from docx import Document # 导入docx包
文件 = Document('D:/练习.docx')
表 = 文件.tables[0] # 读取第1个表格
# 第一种方法,对单元格赋值为空
表.cell(0,0).text = "" # 将表的第1行第1列单元格赋值为空
# 第二种方法,对段落赋值为空
段落 = 表.cell(0,1).paragraphs[0].text = "" # 表的第1行第2列第1个段落赋值为空
文件.save('D:/练习2.docx')

删除表格行或列数据

人在python-docx中没有找到删除一整行或列数据的方法,不过可以通过遍历行或列内的cell,然后利用删除行或列内所有单元格的方法来实现

from docx import Document # 导入docx包
文件 = Document('D:/练习.docx')
表 = 文件.tables[0] # 读取第1个表格
for 单元格 in 表.rows[0].cells: # 遍历表格中第1行中所有的单元格
    单元格.text = "" # 将所有单元格赋值为空
for 单元格 in 表.columns[0].cells:  # 遍历表格中第1列中所有的单元格
    单元格.text = ""  # 将所有单元格赋值为空
文件.save('D:/练习2.docx')

表格对齐与列宽调整

from docx import Document # 导入docx包
from docx.enum.table import WD_TABLE_ALIGNMENT # 导入表格对齐方式
from docx.shared import Cm
文件=Document('D:/练习.docx')
表 = 文件.tables[0] # 指定第1个表格
表.alignment = WD_TABLE_ALIGNMENT.RIGHT # 设置表格为右对齐
for 列 in 表.columns: # 表格1设置列宽为10cm
    for 单元格 in 列.cells:
        单元格.width = Cm(1)
文件.save('D:/练习2.docx')

3种对齐方式
  • WD_TABLE_ALIGNMENT.LEFT 左对齐

  • WD_TABLE_ALIGNMENT.CENTER 居中对齐

  • WD_TABLE_ALIGNMENT.RIGHT 右对齐

如果要行高调整
  • 把columns改成rows
  • 把列.cells改成行.cells
  • 把单元格.width改成单元格.height

单元格对齐

需引入单元格垂直对齐包

from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT

在对单元格对齐方式设置的时候,将单元格视为一个整体,要使用单元格中的垂直对齐(cell.vertical_alignment)和单元格中的段落的对齐 (paragraph.alignment)等2种对齐方式配合使用

在docx.enum.table .WD_ALIGN_VERTICAL定义了TOP、CENTER和BOTTOM等3种类型

  • WD_CELL_VERTICAL_ALIGNMENT.TOP 单元格内容靠上对齐
  • WD_CELL_VERTICAL_ALIGNMENT.CENTER 单元格内容居中对齐
  • WD_CELL_VERTICAL_ALIGNMENT.BOTTOM 单元格内容靠下对齐

在WD_PARAGRAPH_ALIGNMENT中定义了4中类型,分别是LEFT、CENTER、RIGHT和JUSTIFY等4中类型

  • WD_PARAGRAPH_ALIGNMENT.LEFT 段落左对齐
  • WD_PARAGRAPH_ALIGNMENT.CENTER 段落居中对齐
  • WD_PARAGRAPH_ALIGNMENT.RIGHT 段落右对齐
  • WD_PARAGRAPH_ALIGNMENT.JUSTIFY 段落两端对齐

在单元格垂直对齐和段落对齐的配合过程中可以组合成12种方式,分别是:靠上两端对齐、靠上居中对齐、靠上右对齐、中部两端对齐、中部居中对齐、中部右对 齐、靠下两端对齐、靠下居中对齐、靠下右对齐、靠上左对齐、中部左对齐、靠下左对齐。其中,在WORD软件中内置了前9种对齐方式。

from docx import Document
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.enum.table import WD_CELL_VERTICAL_ALIGNMENT
文件=Document('D:/练习.docx')
表 = 文件.tables[0] # 指定第1个表格
单元格 = 表.cell(0,1) # 指定单元格
# 靠上居中对齐
单元格.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.TOP
单元格.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
文件.save('D:/练习2.docx')

通过改变这2个函数的参数可以形成其他8种对齐方式

单元格.vertical_alignment

单元格.paragraphs[0].alignment =

修改表格中所有单元格的字体

只能通过遍历单元格的每个字段对其进行修改

from docx import Document
from docx.oxml.ns import qn# 中文字体
文件=Document('D:/练习.docx')
表 = 文件.tables[0] # 指定第1个表格
for 行 in 表.rows:
    for 单元格 in 行.cells:
        for 段落 in 单元格.paragraphs:
            for 块 in 段落.runs:
                块.font.name = 'Arial' # 英文字体设置
                块._element.rPr.rFonts.set(qn('w:eastAsia'), '微软雅黑') # 设置中文字体
文件.save('D:/练习2.docx')

五 对文字的操作

所有文字样式调整

对所有文字字体样式进行修改 :run.font.样式 = xxx

from docx import Document
from docx.shared import Pt, RGBColor # 字号,颜色
from docx.oxml.ns import qn # 中文字体
文件 = Document('D:/练习.docx')
for 段落 in 文件.paragraphs:
 for 块 in 段落.runs:
    块.font.bold = True # 加粗
    块.font.italic = True # 斜体
    块.font.underline = True # 下划线
    块.font.strike = True # 删除线
    块.font.shadow = True # 阴影
    块.font.size = Pt(10)#字号
    块.font.color.rgb = RGBColor(255,0,0) # 颜色
    块.font.name = 'Arial' # 英文字体设置
    块._element.rPr.rFonts.set(qn('w:eastAsia'),'微软雅黑') # 设置中文字体
文件.save('D:/练习2.docx')

正文字体修改

from docx import Document
from docx.shared import Pt, RGBColor # 字号,颜色
from docx.oxml.ns import qn # 中文字体
文件 = Document('D:/练习2.docx')
文件.styles['Normal'].font.name = 'Arial' # 设置英文字体
文件.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体') # 设置中文字体

文件.save('D:/练习.docx')

可以看出,只有正文的文字的字体发生变化

文件.styles['Normal'] 意思是文件标题中的正文

标题文字修改

from docx import Document
from docx.shared import Pt, RGBColor # 字号,颜色
from docx.oxml.ns import qn # 中文字体
文件 = Document('D:/练习2.docx')
#对二级标题进行文字修改,'Normal'为正文,要对标题进行修改则写 ’Heading 标题等级‘
文件.styles['Heading 2'].font.name = 'Arial'
文件.styles['Heading 2']._element.rPr.rFonts.set(qn('w:eastAsia'), '宋体')

文件.save('D:/练习.docx')

六 对段落修改

对齐

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
文件 = Document('D:/练习2.docx')
for 段落 in 文件.paragraphs:
#'Normal'为正文,要对标题进行修改则写 ’Heading 标题等级‘ 比如段落.style.name=='Heading 1'
   if 段落.style.name=='Normal':
      段落.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
文件.save('D:/练习.docx')

对齐方式:段落.alignment = WD_PARAGRAPH_ALIGNMENT.xxxxx

  • LEFT 靠左
  • CENTER 居中
  • RIGHT 靠右
  • JUSTIFY 两端对齐
  • DISTRIBUTE 分散对齐

普通行间距调整

长度

  • from docx.shared import Pt # Pt磅
  • from docx.shared import Inches #Inches英寸,Inches(0.5)等于四个空格
  • from docx.shared import Cm #厘米
  • from docx.shared import Mm #毫米
一 正文之间的行间距
from docx import Document
文件 = Document('D:/练习2.docx')
for 段落 in 文件.paragraphs:
#'Normal'为正文,要对标题进行修改则写 ’Heading 标题等级‘ 比如段落.style.name=='Heading 1'
   if 段落.style.name=='Normal':
      段落.paragraph_format.line_spacing = 5.0
文件.save('D:/练习.docx')
二 全部段落
from docx import Document
文件 = Document('D:/练习2.docx')
for 段落 in 文件.paragraphs:
   段落.paragraph_format.line_spacing = 5.0
文件.save('D:/练习.docx')

可以看出,改变全部段落跟正文或标题的操作是一样的,修改正文或标题只是多了一个if

特殊行间距调整

1.5倍行距
from docx.enum.text import WD_LINE_SPACING
from docx import Document
文件 = Document('D:/练习2.docx')
for 段落 in 文件.paragraphs:
   #if 段落.style.name == 'Normal':添加这句则只对正文修改
   段落.paragraph_format.line_spacing_rule = WD_LINE_SPACING.ONE_POINT_FIVE
文件.save('D:/练习.docx')
固定值
from docx.enum.text import WD_LINE_SPACING
from docx.shared import Pt# Pt磅
from docx import Document
文件 = Document('D:/练习2.docx')
for 段落 in 文件.paragraphs:
   段落.line_spacing_rule = WD_LINE_SPACING.EXACTLY
   段落.paragraph_format.line_spacing = Pt(18)#18磅
文件.save('D:/练习.docx')
多倍行距
from docx.enum.text import WD_LINE_SPACING
from docx.shared import Pt# Pt磅
from docx import Document
文件 = Document('D:/练习2.docx')
for 段落 in 文件.paragraphs:
   段落.line_spacing_rule = WD_LINE_SPACING.MULTIPLE
   段落.paragraph_format.line_spacing = 1.75#1.75倍
文件.save('D:/练习.docx')

段前 段后间距

from docx.shared import Pt
from docx import Document
文件 = Document('D:/练习2.docx')
for 段落 in 文件.paragraphs:
   #if 段落.style.name == 'Normal':添加这句则只对正文修改
   段落.paragraph_format.space_before = Pt(18) # 段前
   段落.paragraph_format.space_after = Pt(12) # 段后
文件.save('D:/练习.docx')

左缩进 left_indent

from docx.shared import Pt
from docx import Document
文件 = Document('D:/练习2.docx')
for 段落 in 文件.paragraphs:
   if 段落.style.name == 'Normal':
      段落.paragraph_format.left_indent=Pt(0.3)
文件.save('D:/练习.docx')

右缩进 right_indent

from docx.shared import Pt
from docx import Document
文件 = Document('D:/练习2.docx')
for 段落 in 文件.paragraphs:
   if 段落.style.name == 'Normal':
      段落.paragraph_format.right_indent=Pt(0.3)
文件.save('D:/练习.docx')

首行缩进与悬挂缩进 first_line_indent

首行缩进和悬挂缩进使用first_line_indent属性来实现,当值为大于0时,为首行缩进,当值为小于0时为悬挂缩进

from docx.shared import Pt,Inches
from docx import Document
文件 = Document('D:/练习2.docx')
for 段落 in 文件.paragraphs:
   if 段落.style.name == 'Normal':
      段落.paragraph_format.first_line_indent=Inches(0.3) # 1 英寸=2.54 厘米

文件.save('D:/练习.docx')

七 对节(页面)的操作

什么是节

在WORD文档中添加节要使用“布局”菜单里“分隔符”按钮分节符功能

Word中节的作用是针对页面可以设置不一样的效果:

1、同一篇文档中可以通过节设置不同的纸张大小,方向以及页边距。

2、同一篇文档中可以通过节设置不同的页眉页脚,默认情况下所有页面均处于同一节,可以灵活设置多页是一节,也可以一页是就是一节

3、同一篇文档中可以通过节控制页码的显示,主要针对文章带有目录,很多情况下,目录所在的页面是不占页码的,正文当第一页去使用。

添加节(分节符)

文件.add_section()

from docx import Document
文件 = Document()
print('默认节的数量:', len(文件.sections)) # 打印默认节对数量
print('默认段落的数量:', len(文件.paragraphs)) # 打印默认段落数量
文件.add_section() # 添加第2个节
print('节的数量:', len(文件.sections)) # 打印节对数量
print('段落的数量:', len(文件.paragraphs)) # 打印段落数量
文件.add_section() # 添加第3个节
print('节的数量:', len(文件.sections)) # 打印节对数量
print('段落的数量:', len(文件.paragraphs)) # 打印段落数量

可以看出,一个节占用一个段落,在添加分节符的时候,也添加了段落

节的定位

节 = 文件.sections[1] # 获取第2个节

页眉和页脚

设置页眉 页脚

页眉和页脚的内容是通过段落来添加的

from docx import Document
from docx.enum.section import WD_SECTION_START
文件 = Document('D:/练习.docx')
页眉 = 文件.sections[0].header # 获取第一个节的页眉
段落 = 页眉.paragraphs[0] # 获取页眉的第一个段落
段落.add_run('这是第一节的页眉') # 添加页面内容
页脚 = 文件.sections[0].footer # 获取第一个节的页脚
段落 = 页脚.paragraphs[0] # 获取页脚的第一个段落
段落.add_run('这是第一节的页脚') # 添加页脚内容
文件.save('D:/练习2.docx')

设置完第一节的页眉和页脚后再添加新的节,会发现

要使新的节不与上一节相同,应添加(以页眉为例)

页眉 = 文件.sections[1].header # 获取第2个节的页眉

页眉.is_linked_to_previous = False # 不使用上节内容和样式
from docx import Document
文件 = Document('D:/练习.docx')
页眉 = 文件.sections[0].header # 获取第一个节的页眉
段落 = 页眉.paragraphs[0] # 获取页眉的第一个段落
段落.add_run('这是第一节的页眉') # 添加页面内容
页脚 = 文件.sections[0].footer # 获取第一个节的页脚
段落 = 页脚.paragraphs[0] # 获取页脚的第一个段落
段落.add_run('这是第一节的页脚') # 添加页脚内容
文件.add_section() # 添加一个新的节
页眉 = 文件.sections[1].header # 获取第2个节的页眉
页眉.is_linked_to_previous = False # 不使用上节内容和样式
段落 = 页眉.paragraphs[0] # 获取页眉的第一个段落
段落.add_run('这是第二节的页眉') # 添加页面内容
页脚 = 文件.sections[1].footer # 获取第2个节的页眉
页脚.is_linked_to_previous = False # 不使用上节内容和样式
段落 = 页脚.paragraphs[0] # 获取页脚的第一个段落
段落.add_run('这是第二节的页脚') # 添加页脚内容
文件.save('D:/练习2.docx')


设置对齐

页眉和页脚的内容是通过段落来添加的,所以通过设置段落的对齐方式就可以实现对页眉或者页脚的对齐。有关段落对齐以及更多的内容可以参考第六章。

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
文件 = Document('D:/练习.docx')
文件.add_section()#添加一个节,因为打开的文档是空文档,引用第二节前要先添加,不然会报错
页眉 = 文件.sections[1].header
页脚 = 文件.sections[1].footer
页眉.is_linked_to_previous = False # 获取第2个节的页眉,不使用上节内容和样式
页眉.paragraphs[0].add_run('这是第二节的页眉') # 获取页眉的第一个段落,加入文字
页眉.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # 设置页眉靠左对齐
页脚.is_linked_to_previous = False # 获取第2个节的页脚,不使用上节内容和样式
页脚.paragraphs[0].add_run('这是第二节的页脚') # 获取页脚的第一个段落,加入文字
页脚.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 设置页脚居中对齐
文件.save('D:/练习2.docx')


页眉和页脚距离

在section中的:

header_distance属性可以用来设置页眉距离顶端的距离

footer_distance属性则用来设置页脚距离底端的距离

from docx import Document
from docx.shared import Cm
文件 = Document('D:/练习.docx')
文件.add_section()
页眉 = 文件.sections[1].header
页脚 = 文件.sections[1].footer
页眉.is_linked_to_previous = False # 获取第2个节的页眉,不使用上节内容和样式
页眉.paragraphs[0].add_run('这是第二节的页眉') # 获取页眉的第一个段落,加入文字
页脚.is_linked_to_previous = False # 获取第2个节的页脚,不使用上节内容和样式
页脚.paragraphs[0].add_run('这是第二节的页脚') # 获取页脚的第一个段落,加入文字
文件.sections[1].header_distance = Cm(10) # 设置页眉为10厘米
文件.sections[1].footer_distance = Cm(10) # 设置页脚为10厘米
文件.save('D:/练习2.docx')
奇偶页不同

在docx文档中odd_and_even_pages_header_footer属性默认为False,即文档的奇偶页是相同的。当设置为True时,启动了奇偶页不同。

启动奇偶页不同 文件.settings.odd_and_even_pages_header_footer = True

在python-docx中 含有的偶数页页眉对象section.even_page_header,偶数页页脚对象section.even_page_footer;但却没有奇数页的对象,当设置的section.header或者 section.footer时,默认设置在奇数页上。

from docx import Document
from docx.shared import Pt
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
文件 = Document('D:/练习.docx')
文件.settings.odd_and_even_pages_header_footer = True # 启动奇偶页不同
第一个节 = 文件.sections[0] # 第一个节
偶数页 = 第一个节.even_page_header # 获取偶数页
偶数页眉 = 偶数页.paragraphs[0].add_run('这是偶数页页眉')
偶数页眉.font.size = Pt(26) # 设置偶数页页眉大小
偶数页.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT # 设置页眉右对齐
奇数页 = 第一个节.header # 获取偶数页
奇数页眉 = 奇数页.paragraphs[0].add_run('这是奇数页页眉')
奇数页眉.font.size = Pt(16) # 设置偶数页页眉大小
奇数页.paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.LEFT # 设置页眉左对齐
文件.save('D:/练习2.docx')


注:页脚同样的方法去设置

首页不同

设置首页不同要用到section中的 different_first_page_header_footer对象

首页不同默认状态 节.different_first_page_header_footer =False

设置启动首页不同 节.different_first_page_header_footer = True

from docx import Document
文件 = Document('D:/练习.docx')
第1个节 = 文件.sections[0] # 获取第1个节的对象
print('首页不同默认状态:', 第1个节.different_first_page_header_footer)
第1个节.different_first_page_header_footer = True # 设置启动首页不同
文件.save('D:/练习2.docx')

from docx import Document
from docx.shared import Pt
文件 = Document('D:/练习.docx')
第1个节 = 文件.sections[0] # 获取第1个节的对象
第1个节.different_first_page_header_footer = True # 设置启动首页不同
首页对象 = 第1个节.first_page_header # 先要启动首页不同,才能设置对象
首页页眉 = 首页对象.paragraphs[0].add_run('这是首页')
首页页眉.font.size = Pt(48)
文件.save('D:/练习2.docx')
优先级

优先级生效的顺序依次是首页不同>奇偶页>普通页

页面设计

页面大小
from docx import Document
from docx.shared import Cm
文件 = Document('D:/练习.docx')
第1个节 = 文件.sections[0] # 获取第1个节
# 打印默认页面宽度和高度
print('默认页面的宽度和高度:', 第1个节.page_width.cm,第1个节.page_height.cm)
第1个节.page_width = Cm(40)
第1个节.page_height = Cm(40)
# 打印修改后的页面宽度和高度
print('修改后页面的宽度和高度:', 第1个节.page_width.cm,第1个节.page_height.cm)
文件.save('D:/练习2.docx')

设置纸张方向

WD_ORIENTATION.LANDSCAPE 纸张方向为横向

WD_ORIENTATION.PORTRAIT 纸张方向为纵向[默认]

新建文档

from docx.enum.section import WD_ORIENTATION # 纸张方向
from docx import Document
from docx.shared import Cm
文件 = Document() # 新建文档
第1个节 = 文件.sections[0] # 获取第1个节
第1个节.orientation = WD_ORIENTATION.LANDSCAPE # 指定为横向,不能省略,否则尺寸变了但还是纵向
第1个节.page_width = Cm(29.7) #宽
第1个节.page_height = Cm(21) # 高
文件.save('D:/练习2.docx')

已有文档

from docx.enum.section import WD_ORIENTATION # 纸张方向
from docx import Document
from docx.shared import Cm
文件 = Document('D:/练习.docx')
第1个节 = 文件.sections[0] # 获取第1个节
第1个节.orientation = WD_ORIENTATION.LANDSCAPE # 指定为横向
宽, 高 = 第1个节.page_width, 第1个节.page_height
第1个节.page_width = 高 #宽=高
第1个节.page_height = 宽 # 高=宽
文件.save('D:/练习2.docx')

设置页面边距
  • section.top_margin 上边距

  • section.bottom_margin 下边距

  • section.left_margin 左边距

  • section.right_margin 右边距

from docx.shared import Cm
from docx import Document
文件=Document('D:/练习.docx')
第1个节 = 文件.sections[0] # 获取第1个节
print("上边距:", 第1个节.top_margin.cm)
print("下边距:", 第1个节.bottom_margin.cm)
print("左边距:", 第1个节.left_margin.cm)
print("右边距:", 第1个节.right_margin.cm)
第1个节.top_margin = Cm(15)
第1个节.bottom_margin = Cm(5)
第1个节.left_margin = Cm(4)
第1个节.right_margin = Cm(4)
print('**********修改后************')
print("上边距:", 第1个节.top_margin.cm)
print("下边距:", 第1个节.bottom_margin.cm)
print("左边距:", 第1个节.left_margin.cm)
print("右边距:", 第1个节.right_margin.cm)
文件.save('D:/练习2.docx')

设置装订线

对于一些公文、公司重要资料、书籍以及考试的试卷,通常都需要为其设置装订线。 在Word中,装订线可根据实际需要设置在文档的左侧或顶端,且在设置默认的装订线后,在要装订的文档左侧或顶部的页边距会预留出额外装订空间,以保证后期装订成册时不会因装订而遮住文档文字,同时避免掉页的情况发生,还能更好地密封封存。

from docx.shared import Cm
from docx import Document
文件=Document('D:/练习.docx')
第1个节 = 文件.sections[0] # 获取第1个节
第1个节 = 文件.sections[0] # 获取第1个节
print('设置装订前', 第1个节.gutter.cm)
第1个节.gutter = Cm(2)
print('设置装订线后:', 第1个节.gutter.cm)
文件.save('D:/练习2.docx')

本文内容来自于对跟着孙兴华学习Python办公自动化 word篇 python-docx所讲内容整理

posted @ 2022-01-27 10:39  计科废物1  阅读(1962)  评论(0编辑  收藏  举报
@media only screen and (max-width: 767px){ #sidebar_search_box input[type=text]{width:calc(100% - 24px)} } L2Dwidget.init({ "model": { jsonPath: "https://unpkg.com/live2d-widget-model-hijiki/assets/hijiki.model.json", "scale": 1 }, "display": { "position": "left", "width": 100, "height": 200, "hOffset": 70, "vOffset": 0 }, "mobile": { "show": true, "scale": 0.5 }, "react": { "opacityDefault": 0.7, "opacityOnHover": 0.2 } }); window.onload = function(){ $("#live2dcanvas").attr("style","position: fixed; opacity: 0.7; left: 70px; bottom: 0px; z-index: 1; pointer-events: none;") }