Python使用python-docx庫操作word(創(chuàng)建、讀取和插入)文檔的完整指南
python-docx是一個(gè)可以操作Word文檔的python開源庫,簡(jiǎn)單易用,適合用來自動(dòng)化辦公。
一、安裝 python-docx 庫
可以使用pip命令安裝python-docx 庫。在 windows 命令行窗口執(zhí)行如下命令:
pip install python-docx C:\Users\wgx58>pip install python-docx Collecting python-docx Using cached python_docx-1.2.0-py3-none-any.whl.metadata (2.0 kB) Requirement already satisfied: lxml>=3.1.0 in c:\python\lib\site-packages (from python-docx) (6.0.2) Requirement already satisfied: typing_extensions>=4.9.0 in c:\python\lib\site-packages (from python-docx) (4.15.0) Using cached python_docx-1.2.0-py3-none-any.whl (252 kB) Installing collected packages: python-docx Successfully installed python-docx-1.2.0
二、新建與打開word文檔
在python-docx中,一個(gè)Word文檔用一個(gè)Document對(duì)象來表示,所以我們要新建一個(gè)Word文檔,只需要實(shí)例化一個(gè)Document對(duì)象即可。
程序代碼如下:
from docx import Document
doc = Document()
doc.save('D:/0工作文檔/word文檔/mydoc.docx')
要打開一個(gè)已存在的Word文檔,只需要在實(shí)例化的時(shí)候傳入該文檔的路徑即可。
程序代碼如下:
from docx import Document
doc = Document('D:/0工作文檔/word文檔/mydoc.docx')
doc.save('D:/0工作文檔/word文檔/mydoc1.docx')
三、保存word文檔
要保存word文檔可以調(diào)用Document對(duì)象的save()方法,傳入要保存的路徑即可。
說明:如果該路徑已存在同名文件,會(huì)直接被覆蓋掉,并不會(huì)給出任何提示。
程序代碼如下:
from docx import Document
doc = Document('D:/0工作文檔/word文檔/mydoc.docx')
doc.save('D:/0工作文檔/word文檔/mydoc1.docx')
四、在word文檔中插入各種內(nèi)容
相關(guān)概念
1、Document對(duì)象
Document對(duì)象表示整個(gè)文檔。
2、paragraph對(duì)象
每一個(gè)段落代表一個(gè)paragraph對(duì)象。
3、run對(duì)象
一個(gè)run對(duì)象指的是paragraph對(duì)象中相同樣式的連續(xù)文字。
4、table對(duì)象
table對(duì)象指的是一個(gè)單獨(dú)的表格。一個(gè)表包含行(row)、列(column)和單元格(cell)。
以上各類對(duì)象之間的關(guān)系如下圖所示:

添加標(biāo)題
本節(jié)用到的函數(shù)及屬性如下表所示:
| 函數(shù)/屬性 | 用法 |
|---|---|
| docx.Document() | 創(chuàng)建word文檔 |
| doc.add_heading(content,level) | 添加標(biāo)題 |
| doc.save(path) | 保存word文檔 |
例如:
from docx import Document
def create_word():
doc1 = Document() # 創(chuàng)建word文檔
doc1.add_heading('歡迎使用Python創(chuàng)建Word',0) # 增加0級(jí)標(biāo)題
doc1.add_heading('Python操作 增加1級(jí)標(biāo)題',1) # 增加1級(jí)標(biāo)題
doc1.add_heading('Python操作 增加2級(jí)標(biāo)題',2) # 增加2級(jí)標(biāo)題
doc1.save(r'D:\0工作文檔\word文檔\test.docx') # 保存文檔
if __name__ == '__main__':
create_word()
程序的運(yùn)行結(jié)果如下圖所示:

插入段落
本節(jié)用到的函數(shù)及屬性如下表所示:
| 函數(shù)/屬性 | 用法 |
|---|---|
| doc.add.paragraph(content,style) | 添加段落 |
| paragraph.add_run(content) | 添加塊 |
例如:
from docx import Document
from docx.enum.style import WD_BUILTIN_STYLE
def create_word():
doc1 = Document() # 創(chuàng)建一個(gè)word文檔
doc1.add_paragraph('七律·長(zhǎng)征','heading 1') # 增加段落信息,使用【標(biāo)題1】樣式
par1=doc1.add_paragraph('作者:毛澤東\n')
par1.add_run('紅軍不怕遠(yuǎn)征難,萬水千山只等閑。\n')
par1.add_run('五嶺逶迤騰細(xì)浪,烏蒙磅礴走泥丸。\n')
par1.add_run('金沙水拍云崖暖,大渡橋橫鐵索寒。\n')
par1.add_run('更喜岷山千里雪,三軍過后盡開顏。\n')
doc1.add_paragraph('譯文','heading 2')
doc1.add_paragraph('紅軍不怕萬里長(zhǎng)征路上的一切艱難困苦,把千山萬水都看得極為平常。\n五嶺山脈綿延不絕,可在紅軍眼里不過像翻騰著的細(xì)小波浪;烏蒙山高大雄偉,在紅軍眼里也不過像在腳下滾過的泥丸。\n金沙江濁浪滔天,湍急的流水拍擊著高聳的山崖,濺起陣陣霧水,像是冒出蒸汽一樣。大渡河險(xiǎn)橋橫架,晃動(dòng)著凌空高懸的根根鐵索,寒意陣陣。\n更加令人欣喜的是千里岷山,皚皚白雪,紅軍翻越過去以后人人心情開朗,個(gè)個(gè)笑逐顏開。')
# 增加無序列表
doc1.add_paragraph('新鄉(xiāng)市的高校:')
doc1.add_paragraph('河南科技學(xué)院',style='List Bullet')
doc1.add_paragraph('河南醫(yī)藥大學(xué)',style='List Bullet')
doc1.add_paragraph('河南師范大學(xué)',style='List Bullet')
doc1.add_paragraph('河南工學(xué)院',style='List Bullet')
doc1.add_paragraph('新鄉(xiāng)學(xué)院',style='List Bullet')
# 增加有序列表
doc1.add_paragraph('新鄉(xiāng)市的高校:')
doc1.add_paragraph('河南師范大學(xué)',style='List Number')
doc1.add_paragraph('河南醫(yī)藥大學(xué)',style='List Number')
doc1.add_paragraph('河南科技學(xué)院',style='List Number')
doc1.add_paragraph('河南工學(xué)院',style='List Number')
doc1.add_paragraph('新鄉(xiāng)學(xué)院',style='List Number')
# 保存word文檔
doc1.save(r'D:\0工作文檔\word文檔\test.docx') # 保存文檔
if __name__ =='__main__':
create_word()
程序的運(yùn)行結(jié)果如下圖所示:

插入塊(run)
代碼如下:
from docx import Document
def create_word():
doc1 = Document() # 創(chuàng)建一個(gè)word文檔
doc1.add_paragraph('七律·長(zhǎng)征', 'Title') # 增加段落信息,使用【標(biāo)題1】樣式
par1 = doc1.add_paragraph('作者:毛澤東\n')
par1.add_run('紅軍不怕遠(yuǎn)征難,萬水千山只等閑。\n')
par1.add_run('五嶺逶迤騰細(xì)浪,烏蒙磅礴走泥丸。\n')
par1.add_run('金沙水拍云崖暖,大渡橋橫鐵索寒。\n')
par1.add_run('更喜岷山千里雪,三軍過后盡開顏。')
par1.runs[0].bold = True
par1.runs[1].underline = True
par1.runs[2].italic = True
par1.runs[3].underline = True
par1.runs[4].italic = True
doc1.save(r'D:\0工作文檔\word文檔\test.docx') # 保存文檔
if __name__ == '__main__':
create_word()
程序的運(yùn)行結(jié)果如下圖所示:

插入分頁符
插入分頁符使用add_page_break,代碼如下:
from docx import Document
from docx.enum.style import WD_BUILTIN_STYLE
def create_word():
doc1 = Document() # 創(chuàng)建一個(gè)word文檔
doc1.add_paragraph('七律·長(zhǎng)征','title') # 增加段落信息,使用【標(biāo)題1】樣式
par1=doc1.add_paragraph('作者:毛澤東\n')
par1.add_run('紅軍不怕遠(yuǎn)征難,萬水千山只等閑。\n')
par1.add_run('五嶺逶迤騰細(xì)浪,烏蒙磅礴走泥丸。\n')
par1.add_run('金沙水拍云崖暖,大渡橋橫鐵索寒。\n')
par1.add_run('更喜岷山千里雪,三軍過后盡開顏。\n')
doc1.add_paragraph('譯文','titile')
doc1.add_paragraph('紅軍不怕萬里長(zhǎng)征路上的一切艱難困苦,把千山萬水都看得極為平常。\n五嶺山脈綿延不絕,可在紅軍眼里不過像翻騰著的細(xì)小波浪;烏蒙山高大雄偉,在紅軍眼里也不過像在腳下滾過的泥丸。\n金沙江濁浪滔天,湍急的流水拍擊著高聳的山崖,濺起陣陣霧水,像是冒出蒸汽一樣。大渡河險(xiǎn)橋橫架,晃動(dòng)著凌空高懸的根根鐵索,寒意陣陣。\n更加令人欣喜的是千里岷山,皚皚白雪,紅軍翻越過去以后人人心情開朗,個(gè)個(gè)笑逐顏開。')
doc1.add_page_break() # 在此處插入一個(gè)分頁符
# 增加無序列表
doc1.add_paragraph('新鄉(xiāng)市的高校:')
doc1.add_paragraph('河南科技學(xué)院',style='List Bullet')
doc1.add_paragraph('河南醫(yī)藥大學(xué)',style='List Bullet')
doc1.add_paragraph('河南師范大學(xué)',style='List Bullet')
doc1.add_paragraph('河南工學(xué)院',style='List Bullet')
doc1.add_paragraph('新鄉(xiāng)學(xué)院',style='List Bullet')
# 增加有序列表
doc1.add_paragraph('新鄉(xiāng)市的高校:')
doc1.add_paragraph('河南師范大學(xué)',style='List Bullet')
doc1.add_paragraph('河南醫(yī)藥大學(xué)',style='List Bullet')
doc1.add_paragraph('河南科技學(xué)院',style='List Bullet')
doc1.add_paragraph('河南工學(xué)院',style='List Bullet')
doc1.add_paragraph('新鄉(xiāng)學(xué)院',style='List Bullet')
# 保存word文檔
doc1.save(r'D:\0工作文檔\word文檔\test.docx') # 保存文檔
if __name__ =='__main__':
create_word()
插入圖片
本節(jié)用到的函數(shù)及屬性如下表所示:
| 函數(shù)/屬性 | 用法 |
|---|---|
| doc.add_picture(path,width,height) | 添加圖片 |
| pic.width | 獲取圖片寬度 |
| pic.height | 獲取圖片高度 |
| doc.sections[0].page_width | 獲取頁面寬度 |
| doc.sections[0].left_margin | 獲取頁面高度 |
例如:
from docx import Document
def create_word():
doc1 = Document()
page_width = doc1.sections[0].page_width # 獲取文檔的寬度
page_left_width = doc1.sections[0].left_margin # 獲取文檔的左邊距
print(page_width)
print(page_left_width)
content_width = page_width-page_left_width*2 # 獲取中間內(nèi)容的寬度
print(content_width)
doc1.add_heading("插入圖片如下",level=0)
# 增加圖片,設(shè)置圖片的寬度占文檔寬度的一半
pic = doc1.add_picture(r'D:\0工作文檔\typora文檔\word\pic01.jpg',int(content_width*0.5))
doc1.save(r'D:\0工作文檔\typora文檔\word\pic.docx') # 保存文檔
if __name__ == '__main__':
create_word()
插入表格
本節(jié)用到的函數(shù)及屬性如下表所示:
| 函數(shù)/屬性 | 用法 |
|---|---|
| doc.add_table(rows=x,cols=x) | 添加表格 |
| table.add_row() | 添加行 |
例如:
from docx import Document
def create_table():
doc1 = Document() # 創(chuàng)建word文檔
t1 = doc1.add_table(1,4) # 添加一個(gè)1行4列的表格
# 設(shè)置表格的內(nèi)容
t1.rows[0].cells[0].text = '學(xué)號(hào)'
t1.rows[0].cells[1].text = '姓名'
t1.rows[0].cells[2].text = '性別'
t1.rows[0].cells[3].text = '班級(jí)'
data = (
(1,'劉備','男','物流231班'),
(2,'孫權(quán)','女','物流231班'),
(3,'曹操','男','物流232班')
)
for s_id,s_name,s_gender,s_class in data:
row = t1.add_row() # 增加一行數(shù)據(jù)
row.cells[0].text = str(s_id) # 注意:要把數(shù)值型轉(zhuǎn)換為文本類型
row.cells[1].text = s_name
row.cells[2].text = s_gender
row.cells[3].text = s_class
doc1.save(r'D:\0工作文檔\typora文檔\word\table.docx') # 保存文檔
if __name__ =='__main__':
create_table()
程序的運(yùn)行結(jié)果如下圖所示:

五、讀取word文檔的內(nèi)容
如果需要讀取word文檔的內(nèi)容,可以通過相關(guān)的變量讀取段落、塊、表格、行、單元格等信息。
讀取段落信息
使用doc.paragraphs屬性返回所有段落的列表。使用paragraph.text獲取段落的內(nèi)容。
程序代碼如下:
from docx import Document doc1 = Document(r"D:\0工作文檔\typora文檔\word\test.docx") # 創(chuàng)建word文檔 print(len(doc1.paragraphs)) print(doc1.paragraphs[0].text) print(doc1.paragraphs[1].text) 程序的運(yùn)行結(jié)果為: 379 一、緒論 (一)課題背景
讀取塊信息
使用paragraph.runs屬性返回段落中所有塊的列表。使用run.text獲取塊的內(nèi)容。
程序代碼如下:
from docx import Document
doc1 = Document(r"D:\0工作文檔\typora文檔\word\test.docx") # 創(chuàng)建word文檔
p=doc1.paragraphs[2]
print(p.text)
runs=p.runs
print(len(runs))
for run in runs:
print(run.text)
讀取表格信息
使用doc.tables屬性返回文檔中所有表格的列表。使用run.text獲取塊的內(nèi)容。
程序代碼如下:
from docx import Document
doc1 = Document(r"D:\0工作文檔\typora文檔\word\test.docx") # 創(chuàng)建word文檔
t=doc1.tables
print("表格數(shù)量:",len(t)) # 返回文檔中表格的數(shù)量
t1=t[0] # 返回第一個(gè)表格
print("第一個(gè)表格的行數(shù):",len(t1.rows)) # 返回第一個(gè)表格的行數(shù)
print("=="*20)
print("==============按行顯示表格內(nèi)容:=================")
print("=="*20)
for row in t1.rows:
for cell in row.cells:
print(cell.text, end=' ')
print("")
print("第一個(gè)表格的列數(shù):",len(t1.columns)) # 返回第一個(gè)表格的列數(shù)
print("=="*20)
print("==============按行列顯示表格內(nèi)容:=================")
print("=="*20)
for column in t1.columns:
for cell in column.cells:
print(cell.text, end=' ')
print("") 使用模板生成文檔
例如:需要生成如下圖所示的學(xué)生成績(jī)通知單(每個(gè)學(xué)生生成一份)。

程序代碼如下:
from docx import Document
def create_score(d):
doc1 = Document() # 創(chuàng)建word文檔
doc1.add_heading(f'{d[1]}成績(jī)通知單',0) # 添加標(biāo)題
t=doc1.add_table(1,6) # 添加表格,1行6列
row=t.rows[0] # 設(shè)置表格第一行每個(gè)單元格內(nèi)容
row.cells[0].text = "學(xué)號(hào)"
row.cells[1].text = "姓名"
row.cells[2].text = "語文"
row.cells[3].text = "數(shù)學(xué)"
row.cells[4].text = "英語"
row.cells[5].text = "班級(jí)"
row=t.add_row() # 添加一行,并設(shè)置每個(gè)單元格內(nèi)容
row.cells[0].text = d[0]
row.cells[1].text = d[1]
row.cells[2].text = str(d[2])
row.cells[3].text = str(d[3])
row.cells[4].text = str(d[4])
row.cells[5].text = d[5]
doc1.save(f"D:/0工作文檔/typora文檔/word/score_{d[1]}.docx") # 保存為單個(gè)文件
if __name__ == '__main__':
data = [
('100001', '李剛', 80, 98, 85, '八年級(jí)二班'),
('100002', '張洪濤', 95, 66, 92, '八年級(jí)二班'),
('100003', '張靜靜', 77, 78, 94, '八年級(jí)二班'),
('100004', '李曉紅', 68, 84, 74, '八年級(jí)二班'),
('100005', '王大光', 91, 97, 93, '八年級(jí)二班'),
('100006', '李珍珍', 87, 78, 79, '八年級(jí)二班')
]
for d in data:
create_score(d)
程序的執(zhí)行結(jié)果如下圖所示:

到此這篇關(guān)于Python使用python-docx庫操作word(創(chuàng)建、讀取和插入)文檔的完整指南的文章就介紹到這了,更多相關(guān)Python python-docx操作word內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python獲取cmd環(huán)境變量值的實(shí)現(xiàn)代碼
這篇文章主要介紹了在Python中獲取命令行(cmd)環(huán)境變量的值,可以使用標(biāo)準(zhǔn)庫中的?os?模塊,需要的朋友可以參考下2025-06-06
Python XML RPC服務(wù)器端和客戶端實(shí)例
這篇文章主要介紹了Python XML RPC服務(wù)器端和客戶端實(shí)例,本文給出了實(shí)現(xiàn)代碼以及運(yùn)行效果,需要的朋友可以參考下2014-11-11
python smtplib模塊發(fā)送SSL/TLS安全郵件實(shí)例
這篇文章主要介紹了python smtplib模塊發(fā)送SSL/TLS安全郵件實(shí)例,本文講解了二種發(fā)送方式,需要的朋友可以參考下2015-04-04
Python基于Opencv來快速實(shí)現(xiàn)人臉識(shí)別過程詳解(完整版)
這篇文章主要介紹了Python基于Opencv來快速實(shí)現(xiàn)人臉識(shí)別過程詳解(完整版)隨著人工智能的日益火熱,計(jì)算機(jī)視覺領(lǐng)域發(fā)展迅速,今天就為大家?guī)碜罨A(chǔ)的人臉識(shí)別基礎(chǔ),從一個(gè)個(gè)函數(shù)開始走進(jìn)這個(gè)奧妙的世界,需要的朋友可以參考下2019-07-07
Pandas數(shù)據(jù)清洗函數(shù)總結(jié)
本文主要介紹了Pandas數(shù)據(jù)清洗函數(shù)總結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
關(guān)于Python字典的底層實(shí)現(xiàn)原理
這篇文章主要介紹了關(guān)于Python字典的底層實(shí)現(xiàn)原理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
Python socket如何實(shí)現(xiàn)服務(wù)端和客戶端數(shù)據(jù)傳輸(TCP)
這篇文章主要介紹了Python socket如何實(shí)現(xiàn)服務(wù)端和客戶端數(shù)據(jù)傳輸(TCP),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
python實(shí)現(xiàn)學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01

