python-docx操作word文件詳解

馬昌偉發表於2022-12-16

案例

官網地址: https://python-docx.readthedocs.io/en/latest/

pip install python-docx

from docx import Document
from docx.shared import Inches

document = Document()

document.add_heading('Document Title', 0)

p = document.add_paragraph('A plain paragraph having some ')
p.add_run('bold').bold = True
p.add_run(' and some ')
p.add_run('italic.').italic = True

document.add_heading('Heading, level 1', level=1)
document.add_paragraph('Intense quote', style='Intense Quote')

document.add_paragraph(
    'first item in unordered list', style='List Bullet'
)
document.add_paragraph(
    'first item in ordered list', style='List Number'
)

# document.add_picture('touxiang2.jpg', width=Inches(1.25))

records = (
    (3, '101', 'Spam'),
    (7, '422', 'Eggs'),
    (4, '631', 'Spam, spam, eggs, and spam')
)

table = document.add_table(rows=1, cols=3)
hdr_cells = table.rows[0].cells
hdr_cells[0].text = 'Qty'
hdr_cells[1].text = 'Id'
hdr_cells[2].text = 'Desc'
for qty, id, desc in records:
    row_cells = table.add_row().cells
    row_cells[0].text = str(qty)
    row_cells[1].text = id
    row_cells[2].text = desc

document.add_page_break()

document.save('demo.docx')

 新增圖片並設定圖片大小

from docx import Document
from docx.shared import Inches
document = Document()
document.add_picture(open('mm.png', mode='rb'),width=Inches(6.0), height=Inches(6.0))
document.save('test.docx')

 

 其它案例

from docx import Document
from docx.shared import Inches

document = Document()
# 0,標題:一、關於圖片
document.add_heading('一、關於圖片', level=2)
# 1,新增圖片
document.add_paragraph('1,新增圖片')
document.add_picture('mm.png')
# 2,設定圖片大小 Inches(1.0)
document.add_paragraph('2,設定圖片大小 width=Inches(1.0)')
document.add_picture('mm.png', width=Inches(1.0))

# 3,設定圖片大小 Inches(4.0)
document.add_paragraph('3,設定圖片大小 width=Inches(4.0)')
document.add_picture('mm.png', width=Inches(4.0))

# 4,設定圖片大小 Inches(6.0)
document.add_paragraph('4,設定圖片大小 width=Inches(6.0)')
document.add_picture('mm.png', width=Inches(6.0))

# 5,設定圖片大小 width=Inches(6.0),height=Inches(6.0)
document.add_paragraph('5,設定圖片大小 width=Inches(6.0),height=Inches(6.0)')
document.add_picture('mm.png', width=Inches(6.0), height=Inches(6.0))

# 最後儲存成word文件
document.save("mcw.docx")
print("docx儲存成功!")

 

 

document.add_paragraph('4,設定圖片大小 width=Inches(6.0)')  這個應該是新增正文,看型別是正文型別

 

1.概念

塊級元素(block-level) 是指作為一個整體的元素,典型的是段落(paragraph)。
行內元素(inline) ,你可以把它理解為一部分塊級元素,即一個塊級元素包含一個或多個行內元素,典型的是run物件(我也不知道run應該翻譯成什麼)。
舉個例子,你在Word回車換行開始輸入文字,即自成一個段落,如果你選中其中的幾個文字,那這些文字即為run物件

2.段落

段落(paragraph)是最主要的塊級元素,比如說我們要往文件裡新增文字,其實就新增段落,add_paragraph()可以新增一個段落,返回一個Paragraph物件

2.1 插入段落

往下新增段落,往指定段落前插入段落

from docx import Document
from docx.text.paragraph import Paragraph

doc = Document()

paragraph1 = doc.add_paragraph("這是第1個段落")
paragraph2 = doc.add_paragraph("這是第2個段落")  # type: Paragraph
# 檢視文件的所有列表
print(doc.paragraphs)  # 返回包含文件所有段落的列表
# 在paragraph2這個段落的前面插入一個段落
paragraph2.insert_paragraph_before("額外插入的段落文字")

doc.save("./test.docx")

 

2.1 段落樣式

2.1.1 引用內建樣式

設定Paragraph的style屬性即可

from docx import Document
from docx.text.paragraph import Paragraph

doc = Document()

paragraph1 = doc.add_paragraph("這是第1個段落")  # type: Paragraph
paragraph1.style = "List Bullet"  # 設定段落樣式為無序1

# 有序段落樣式
doc.add_paragraph("測試段落List Number", style="List Number")
doc.add_paragraph("測試段落List Number", style="List Number")

# 無序段落樣式2
doc.add_paragraph("測試段落List Bullet 2", style="List Bullet 2")
doc.add_paragraph("測試段落List Bullet 2", style="List Bullet 2")

doc.save("./test.docx")

# 一些常用的段落樣式
# styles = doc.styles
# paragraph_styles = [s for s in styles if s.type == WD_STYLE_TYPE.PARAGRAPH]
# for style in paragraph_styles:
#     print(style.name)

 

 

 有下面的樣式

['Normal', 'Header', 'Footer', 'Heading 1', 'Heading 2', 'Heading 3', 'Heading 4', 'Heading 5', 'Heading 6', 'Heading 7', 'Heading 8', 
'Heading 9', 'No Spacing', 'Title', 'Subtitle', 'List Paragraph', 'Body Text', 'Body Text 2', 'Body Text 3', 'List', 'List 2', 'List 3', 'List Bullet', 
'List Bullet 2', 'List Bullet 3', 'List Number', 'List Number 2', 'List Number 3', 'List Continue', 'List Continue 2', 'List Continue 3', 
'macro', 'Quote', 'Caption', 'Intense Quote', 'TOC Heading']

 

官方文件說段落樣式名應該與微軟Office保持一致,但我看了微軟給出的樣式名與其對不上,建議直接參考原始碼的給出的列舉值,位置是/docx/enum/style.py,或者官方文件:https://python-docx.readthedocs.io/en/latest/user/styles-understanding.html

2.1.2 段落對齊

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

doc = Document()

paragraph1 = doc.add_paragraph("這是居中對齊段落")
paragraph1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER  # 居中對齊

doc.add_paragraph("這是左對齊段落").alignment = WD_PARAGRAPH_ALIGNMENT.LEFT  # 左對齊
doc.add_paragraph("這是右對齊段落").alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT  # 右對齊
doc.add_paragraph("這是兩端對齊段落").alignment = WD_PARAGRAPH_ALIGNMENT.JUSTIFY  # 兩端對齊
doc.add_paragraph("這是分散對齊段落").alignment = WD_PARAGRAPH_ALIGNMENT.DISTRIBUTE  # 分散對齊

doc.save("./test.docx")

2.1.3 段落設定

from docx import Document
from docx.shared import Pt

doc = Document()

paragraph1 = doc.add_paragraph("這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落這是一個普通的段落")
# paragraph.line_spacing_rule = WD_LINE_SPACING.EXACTLY  # 行距固定值
# paragraph.line_spacing_rule = WD_LINE_SPACING.MULTIPLE  # 多倍行距
# paragraph1.paragraph_format.line_spacing = 1.5  # 行間距,1.5倍行距
paragraph1.paragraph_format.line_spacing = Pt(20)  # 行間距,固定值20磅
paragraph1.paragraph_format.first_line_indent = Pt(10)  # 首行縮排10磅
paragraph1.paragraph_format.space_before = Pt(30)  # 段前30磅
paragraph1.paragraph_format.space_after = Pt(15)  # 段後15磅

doc.save("./test.docx")

 

特別說明,首行縮排的單位支援Pt、Cm、Mm、Inches等,如果想要縮排幾個字元,需要自己進行轉換,因為不同字號字元佔用的磅數是不同的(五號字型 = 10.5pt = 3.70mm = 14px = 0.146inch)

3.Run

Run是指段落中某一部分文字,我們取到某些文字之後才能設定它們的樣式,例如加粗、斜體、下劃線等

from docx import Document
from docx.oxml.ns import qn
from docx.shared import Pt, RGBColor
from docx.text.paragraph import Paragraph

doc = Document()

paragraph1 = doc.add_paragraph("這是第1個段落")  # type: Paragraph
run1 = paragraph1.add_run("追加的文字")
run1.bold = True  # 加粗
run1.italic = True  # 斜體
run1.underline = True  # 下劃線
# run1.text = "修改之後的文字"  # 修改文字
run1.font.name = "Times New Roman"  # 設定西文是新羅馬字型
run1.element.rPr.rFonts.set(qn('w:eastAsia'), '宋體')  # 設定中文是宋體
run1.font.size = Pt(30)  # 字號大小
run1.font.bold = False  # 是否加粗
run1.font.italic = False  # 是否斜體
run1.font.underline = False  # 是否下劃線
run1.font.shadow = True  # 是否陰影
run1.font.color.rgb = RGBColor(56, 36, 255)  # 字型顏色
# run1.font.color.rgb = RGBColor.from_string("ff0056")  # 字型顏色

doc.save("./test.docx")

關於下劃線,font.underline=True是單行下劃線,其他樣式可以參考官方給出的列舉值:https://python-docx.readthedocs.io/en/latest/api/enum/WdUnderline.html#wdunderline

當然也可以直接使用完整的字元樣式

from docx import Document
from docx.text.paragraph import Paragraph

doc = Document()

paragraph1 = doc.add_paragraph("這是第1個段落")  # type: Paragraph
run2 = paragraph1.add_run("又追加了文字")
run2.style = "Emphasis"  # 使用“強調”樣式

doc.save("./test.docx")

 

 

 

4.標題

可以透過add_heading()新增標題,標題等級用數字0-9表示,其實標題也是一個Paragraph物件

from docx import Document

doc = Document()
title = doc.add_heading(text="這是一級標題", level=1)  # type: Paragraph
doc.add_heading(text="這是一級標題2", level=1)
doc.add_heading(text="這是二級標題", level=2)
print("text:", title.text)  # text: 這是一級標題
print("style:", title.style)  # style: _ParagraphStyle('Heading 1') id: 1883614425040
doc.save("./test.docx")

標題等級(level)預設是1,對應“標題1”,如果設定為0,對應“標題”

5.Document物件常用方法和屬性

from docx import Document
from docx.shared import Inches
from docx.text.paragraph import Paragraph

doc = Document()

doc.add_heading("這是一個標題")
doc.add_paragraph("這是一個段落")
doc.add_page_break()  # 插入一個分頁符,實際上是呼叫新建段落的add_break(WD_BREAK.PAGE)
doc.add_picture('麒麟神獸.png', width=Inches(1.0))  # 新增一張圖片,實際上是呼叫新建段落的run.add_picture
doc.add_table(5, 6)  # 新增一個5行6列的表格

print(doc.paragraphs)  # 返回所有段落(列表)
print(doc.tables)  # 返回所有表格(列表)
print(doc.styles)  # 返回預設Styles物件

doc.save("./test.docx")

 

 

 

 的確分頁了,這是第二頁

 

 


參考連結:https://blog.csdn.net/qq_39147299/article/details/125179590

 

相關文章