Python使用python-docx庫操作word(創(chuàng)建、讀取和插入)文檔的完整指南
python-docx是一個可以操作Word文檔的python開源庫,簡單易用,適合用來自動化辦公。
一、安裝 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中,一個Word文檔用一個Document對象來表示,所以我們要新建一個Word文檔,只需要實例化一個Document對象即可。
程序代碼如下:
from docx import Document
doc = Document()
doc.save('D:/0工作文檔/word文檔/mydoc.docx')
要打開一個已存在的Word文檔,只需要在實例化的時候傳入該文檔的路徑即可。
程序代碼如下:
from docx import Document
doc = Document('D:/0工作文檔/word文檔/mydoc.docx')
doc.save('D:/0工作文檔/word文檔/mydoc1.docx')
三、保存word文檔
要保存word文檔可以調(diào)用Document對象的save()方法,傳入要保存的路徑即可。
說明:如果該路徑已存在同名文件,會直接被覆蓋掉,并不會給出任何提示。
程序代碼如下:
from docx import Document
doc = Document('D:/0工作文檔/word文檔/mydoc.docx')
doc.save('D:/0工作文檔/word文檔/mydoc1.docx')
四、在word文檔中插入各種內(nèi)容
相關概念
1、Document對象
Document對象表示整個文檔。
2、paragraph對象
每一個段落代表一個paragraph對象。
3、run對象
一個run對象指的是paragraph對象中相同樣式的連續(xù)文字。
4、table對象
table對象指的是一個單獨的表格。一個表包含行(row)、列(column)和單元格(cell)。
以上各類對象之間的關系如下圖所示:

添加標題
本節(jié)用到的函數(shù)及屬性如下表所示:
| 函數(shù)/屬性 | 用法 |
|---|---|
| docx.Document() | 創(chuàng)建word文檔 |
| doc.add_heading(content,level) | 添加標題 |
| 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級標題
doc1.add_heading('Python操作 增加1級標題',1) # 增加1級標題
doc1.add_heading('Python操作 增加2級標題',2) # 增加2級標題
doc1.save(r'D:\0工作文檔\word文檔\test.docx') # 保存文檔
if __name__ == '__main__':
create_word()
程序的運行結果如下圖所示:

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

插入塊(run)
代碼如下:
from docx import Document
def create_word():
doc1 = Document() # 創(chuàng)建一個word文檔
doc1.add_paragraph('七律·長征', 'Title') # 增加段落信息,使用【標題1】樣式
par1 = doc1.add_paragraph('作者:毛澤東\n')
par1.add_run('紅軍不怕遠征難,萬水千山只等閑。\n')
par1.add_run('五嶺逶迤騰細浪,烏蒙磅礴走泥丸。\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()
程序的運行結果如下圖所示:

插入分頁符
插入分頁符使用add_page_break,代碼如下:
from docx import Document
from docx.enum.style import WD_BUILTIN_STYLE
def create_word():
doc1 = Document() # 創(chuàng)建一個word文檔
doc1.add_paragraph('七律·長征','title') # 增加段落信息,使用【標題1】樣式
par1=doc1.add_paragraph('作者:毛澤東\n')
par1.add_run('紅軍不怕遠征難,萬水千山只等閑。\n')
par1.add_run('五嶺逶迤騰細浪,烏蒙磅礴走泥丸。\n')
par1.add_run('金沙水拍云崖暖,大渡橋橫鐵索寒。\n')
par1.add_run('更喜岷山千里雪,三軍過后盡開顏。\n')
doc1.add_paragraph('譯文','titile')
doc1.add_paragraph('紅軍不怕萬里長征路上的一切艱難困苦,把千山萬水都看得極為平常。\n五嶺山脈綿延不絕,可在紅軍眼里不過像翻騰著的細小波浪;烏蒙山高大雄偉,在紅軍眼里也不過像在腳下滾過的泥丸。\n金沙江濁浪滔天,湍急的流水拍擊著高聳的山崖,濺起陣陣霧水,像是冒出蒸汽一樣。大渡河險橋橫架,晃動著凌空高懸的根根鐵索,寒意陣陣。\n更加令人欣喜的是千里岷山,皚皚白雪,紅軍翻越過去以后人人心情開朗,個個笑逐顏開。')
doc1.add_page_break() # 在此處插入一個分頁符
# 增加無序列表
doc1.add_paragraph('新鄉(xiāng)市的高校:')
doc1.add_paragraph('河南科技學院',style='List Bullet')
doc1.add_paragraph('河南醫(yī)藥大學',style='List Bullet')
doc1.add_paragraph('河南師范大學',style='List Bullet')
doc1.add_paragraph('河南工學院',style='List Bullet')
doc1.add_paragraph('新鄉(xiāng)學院',style='List Bullet')
# 增加有序列表
doc1.add_paragraph('新鄉(xiāng)市的高校:')
doc1.add_paragraph('河南師范大學',style='List Bullet')
doc1.add_paragraph('河南醫(yī)藥大學',style='List Bullet')
doc1.add_paragraph('河南科技學院',style='List Bullet')
doc1.add_paragraph('河南工學院',style='List Bullet')
doc1.add_paragraph('新鄉(xiāng)學院',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)
# 增加圖片,設置圖片的寬度占文檔寬度的一半
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) # 添加一個1行4列的表格
# 設置表格的內(nèi)容
t1.rows[0].cells[0].text = '學號'
t1.rows[0].cells[1].text = '姓名'
t1.rows[0].cells[2].text = '性別'
t1.rows[0].cells[3].text = '班級'
data = (
(1,'劉備','男','物流231班'),
(2,'孫權','女','物流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ù)值型轉換為文本類型
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()
程序的運行結果如下圖所示:

五、讀取word文檔的內(nèi)容
如果需要讀取word文檔的內(nèi)容,可以通過相關的變量讀取段落、塊、表格、行、單元格等信息。
讀取段落信息
使用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) 程序的運行結果為: 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] # 返回第一個表格
print("第一個表格的行數(shù):",len(t1.rows)) # 返回第一個表格的行數(shù)
print("=="*20)
print("==============按行顯示表格內(nèi)容:=================")
print("=="*20)
for row in t1.rows:
for cell in row.cells:
print(cell.text, end=' ')
print("")
print("第一個表格的列數(shù):",len(t1.columns)) # 返回第一個表格的列數(shù)
print("=="*20)
print("==============按行列顯示表格內(nèi)容:=================")
print("=="*20)
for column in t1.columns:
for cell in column.cells:
print(cell.text, end=' ')
print("") 使用模板生成文檔
例如:需要生成如下圖所示的學生成績通知單(每個學生生成一份)。

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

到此這篇關于Python使用python-docx庫操作word(創(chuàng)建、讀取和插入)文檔的完整指南的文章就介紹到這了,更多相關Python python-docx操作word內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
python中關于py文件之間相互import的問題及解決方法
這篇文章主要介紹了python中關于py文件之間相互import的問題,本文用一個例子演示下如何解決python中循環(huán)引用的問題,需要的朋友可以參考下2022-02-02
Python網(wǎng)絡編程之Python編寫TCP協(xié)議程序的步驟
這篇文章主要介紹了Python網(wǎng)絡編程編寫TCP協(xié)議程序的開發(fā)步驟,通過實例代碼介紹了TCP客戶端程序開發(fā),案例講解多任務版TCP服務端程序開發(fā),需要的朋友可以參考下2022-11-11
解決Jupyter Notebook “signal only works&nb
這篇文章主要介紹了解決Jupyter Notebook “signal only works in main thread“問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01

