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所講內容整理


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM