更多內(nèi)容翰苫,請(qǐng)?jiān)L問(wèn)我的 個(gè)人博客摊欠。
前言
全網(wǎng)找了一番捌显,用python創(chuàng)建和更新word(.docx)文檔吠式,還是 python-docx 包比較好用陡厘。
依賴
- Python 2.6, 2.7, 3.3, or 3.4
- lxml >= 2.3.2
安裝模塊
- 由于
python-docx
已經(jīng)提交給 PyPI 倉(cāng)庫(kù),所以可以使用pip
安裝特占,如下:
如果同時(shí)安裝了pip install python-docx
python2
和python3
那么pip
可能不能用糙置,可以使用pip3
來(lái)安裝,如下:pip3 install python-docx
-
python-docx
也可以使用easy_install
來(lái)安裝是目,如下:easy_install python-docx
- 如果不能使用
pip
和easy_install
谤饭,可以在PyPI
下載包、解壓、運(yùn)行setup.py
揉抵,如下:tar xvzf python-docx-{version}.tar.gz cd python-docx-{version} python setup.py install
python-docx
還依賴lxml
包 亡容,使用前2種方法會(huì)自動(dòng)安裝所需依賴包,第三種方法需要自己手動(dòng)安裝功舀。
處理word文檔
新建文檔類
首先新建一個(gè)空白文檔類 Document 萍倡,如下:
from docx import Document
document = Document()
編輯已存在的word文檔
python-docx 不僅可以創(chuàng)建word文檔,還可以編輯已存在的word文檔辟汰。
其實(shí)吧列敲,這玩意兒只能編輯已存在的word文檔,之所以有個(gè)“創(chuàng)建空白文檔”的功能帖汞,只不過(guò)是拷貝一份空白word文檔到工作區(qū)間戴而,再在空白文檔上編輯,看起來(lái)似乎是“創(chuàng)建空白文檔”罷了翩蘸。本質(zhì)上還是編輯已存在的word文檔所意,捂臉中...
打開(kāi)一個(gè)word文檔,編輯完后催首,一定要記得保存扶踊。如果保存文件名和原文件名不一樣,則會(huì)另存為一份word文檔郎任;若文件名一樣秧耗,則會(huì)不加提示的保存修改內(nèi)容。如下:
from docx import Document
document = Document('existing-document-file.docx')
document.save('new-file-name.docx')
新增段落
在word中 段落
是最常見(jiàn)的舶治,創(chuàng)建段落 paragraph 的操作如下:
paragraph = document.add_paragraph('這是個(gè)段落分井。')
在此段落之前插入一個(gè)段落,如下:
prior_paragraph = paragraph.insert_paragraph_before('這是前面的段落霉猛。')
新增標(biāo)題
新增標(biāo)題代碼如下:
document.add_heading('這是個(gè)標(biāo)題')
修改標(biāo)題大小尺锚,有1-9種規(guī)格,如下:
document.add_heading('The role of dolphins', level=2)
如果使用 level=0
惜浅,則會(huì)新增一個(gè)帶有下劃線樣式的標(biāo)題瘫辩。
新增分頁(yè)符
代碼如下:
document.add_page_break()
新增表格
創(chuàng)建一個(gè)2行2列的表格 Table,如下:
table = document.add_table(rows=2, cols=2)
獲取第一行第二列的單元格類赡矢,如下:
cell = table.cell(0, 1)
寫(xiě)入數(shù)據(jù)杭朱,如下:
cell.text = '這是第一行第二列的單元格'
不僅如此,還能以數(shù)組的形式獲取整個(gè)行或列吹散,如下:
row = table.rows[1]
row.cells[0].text = '第二行第一列'
row.cells[1].text = '第二行第二列'
或循環(huán)操作,如下:
for row in table.rows:
for cell in row.cells:
print(cell.text)
用 len()
方法獲取行數(shù)或列數(shù)八酒,如下:
row_count = len(table.rows)
col_count = len(table.columns)
增加行空民,如下:
row = table.add_row()
設(shè)置表格樣式,如下:
table.style = 'LightShading-Accent1'
插入圖片
插入本地圖片,如下:
document.add_picture('demo.png')
默認(rèn)情況下界轩,圖片大小往往不盡如人意画饥,調(diào)整圖片大小,如下:
from docx.shared import Inches
document.add_picture('demo.png', width=Inches(1.0), height=Inches(1.0))
若同時(shí)定義寬度和高度浊猾,則圖片會(huì)被拉伸或壓縮到指定大卸陡省;若僅定義寬度或高度葫慎,則圖會(huì)自適應(yīng)調(diào)整大小衔彻。所以,建議僅定義寬度即可偷办。
段落操作
設(shè)置段落樣式
設(shè)置段落樣式艰额,如下:
document.add_paragraph('這是一個(gè)樣式為 ListBullet 的段落', style='ListBullet')
或
paragraph = document.add_paragraph('這是一個(gè)樣式為 ListBullet 的段落')
paragraph.style = 'List Bullet'
設(shè)置段落對(duì)齊方式
段落對(duì)齊方式有 左對(duì)齊
、 文字居中
椒涯、 右對(duì)齊
柄沮、 文本兩端對(duì)齊
等,更多對(duì)齊方式請(qǐng)移步 WD_ALIGN_PARAGRAPH
from docx.enum.text import WD_ALIGN_PARAGRAPH
# LEFT => 左對(duì)齊
# CENTER => 文字居中
# RIGHT => 右對(duì)齊
# JUSTIFY => 文本兩端對(duì)齊
paragraph = document.add_paragraph("你說(shuō)啥")
paragraph_format = paragraph.paragraph_format
paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER
設(shè)置段落縮進(jìn)
設(shè)置段落縮進(jìn)废岂,可為負(fù)值祖搓,如下:
from docx.shared import Inches
paragraph = document.add_paragraph("你說(shuō)啥")
paragraph_format = paragraph.paragraph_format
paragraph_format.left_indent = Inches(0.5)
也可以設(shè)置首行縮進(jìn),如下:
paragraph_format.first_line_indent = Inches(-0.25)
設(shè)置段落制表符
詳情請(qǐng)移步 TabStops
設(shè)置段落間距
分為 段前
和 段后
湖苞,設(shè)置值用 Pt
單位是 磅
拯欧,如下:
paragraph_format.space_before = Pt(18)
paragraph_format.space_after = Pt(12)
設(shè)置段落行距
當(dāng)行距為 最小值
和 固定值
時(shí),設(shè)置值單位為 磅
袒啼,需要用 Pt
哈扮;當(dāng)行距為 多倍行距
時(shí),設(shè)置值為數(shù)值蚓再,如下:
from docx.shared import Length
#SINGLE => 單倍行距(默認(rèn))
#ONE_POINT_FIVE => 1.5倍行距
#DOUBLE2 => 倍行距
#AT_LEAST => 最小值
#EXACTLY => 固定值
#MULTIPLE => 多倍行距
paragraph.line_spacing_rule = WD_LINE_SPACING.EXACTLY #固定值
paragraph_format.line_spacing = Pt(18) # 固定值18磅
paragraph.line_spacing_rule = WD_LINE_SPACING.MULTIPLE #多倍行距
paragraph_format.line_spacing = 1.75 # 1.75倍行間距
設(shè)置段落分頁(yè)
- 孤行控制
防止在頁(yè)面頂端單獨(dú)打印段落末行或在頁(yè)面底端單獨(dú)打印段落首行滑肉。 - 與下段同頁(yè)
防止在選中段落與后面一段間插入分頁(yè)符。 - 段中不分頁(yè)
防止在段落中出現(xiàn)分頁(yè)符摘仅。 - 段前分頁(yè)
在選中段落前插入分頁(yè)符靶庙。
#widow_control => 孤行控制
#keep_with_next => 與下段同頁(yè)
#page_break_before => 段前分頁(yè)
#keep_together => 段中不分頁(yè)
paragraph_format.keep_with_next = True
字體操作
設(shè)置粗體和斜體
在設(shè)置粗體和斜體之前,我們先簡(jiǎn)單了解一下 段落
里的運(yùn)行機(jī)制娃属。段落包含很多塊級(jí)的格式六荒,比如縮進(jìn)、行高矾端、制表符等掏击。每一個(gè)小片段叫做一個(gè) run ,可以對(duì) run
設(shè)置粗體和斜體等屬性秩铆。
我們可以設(shè)置如下:
paragraph = document.add_paragraph()
paragraph.add_run('這是一個(gè)帶有')
paragraph.add_run('粗體').bold = True
paragraph.add_run('和')
paragraph.add_run('斜體').italic = True
paragraph.add_run('的段落砚亭。')
設(shè)置字體屬性
對(duì) run
設(shè)置字體灯变、大小、顏色下劃線等捅膘,更多屬性請(qǐng)移步 Font 添祸,如下:
from docx.shared import RGBColor,Pt
#all_caps => 全部大寫(xiě)字母
#bold => 加粗
#color => 字體顏色
#complex_script => 是否為“復(fù)雜代碼”
#cs_bold => “復(fù)雜代碼”加粗
#cs_italic => “復(fù)雜代碼”斜體
#double_strike => 雙刪除線
#emboss => 文本以凸出頁(yè)面的方式出現(xiàn)
#hidden => 隱藏
#imprint => 印記
#italic => 斜體
#name => 字體
#no_proof => 不驗(yàn)證語(yǔ)法錯(cuò)誤
#outline => 顯示字符的輪廓
#shadow => 陰影
#small_caps => 小型大寫(xiě)字母
#snap_to_grid => 定義文檔網(wǎng)格時(shí)對(duì)齊網(wǎng)絡(luò)
#strike => 刪除線
#subscript => 下標(biāo)
#superscript => 上標(biāo)
#underline => 下劃線
paragraph = document.add_paragraph()
paragraph.add_run('這是一個(gè)帶有')
paragraph.add_run('顏色').font.color.rgb = RGBColor(54, 95, 145)
paragraph.add_run('的')
paragraph.add_run('大字').font.size = Pt(36) # 字體大小設(shè)置,和word里面的字號(hào)相對(duì)應(yīng)
設(shè)置字符樣式
除了設(shè)置段落樣式外寻仗,還可以設(shè)置一組字符樣式刃泌,比如字體、大小署尤、顏色耙替、粗體、斜體等沐寺,如下:
# 自定義樣式 Emphasis
paragraph = document.add_paragraph('這是一個(gè)帶有')
paragraph.add_run('自定義樣式', 'Emphasis')
paragraph.add_run('的段落')
或
paragraph = document.add_paragraph('這是一個(gè)帶有 ')
run = paragraph.add_run('自定義樣式')
run.style = 'Emphasis'
paragraph.add_run('的段落')
頁(yè)眉和頁(yè)腳
更多內(nèi)容請(qǐng)移步 Working with Headers and Footers
枚舉的文檔
- MSO_COLOR_TYPE
- MSO_THEME_COLOR_INDEX
- WD_PARAGRAPH_ALIGNMENT
- WD_BUILTIN_STYLE
- WD_CELL_VERTICAL_ALIGNMENT
- WD_COLOR_INDEX
- WD_LINE_SPACING
- WD_ORIENTATION
- WD_TABLE_ALIGNMENT
- WD_ROW_HEIGHT_RULE
- WD_SECTION_START
- WD_STYLE_TYPE
- WD_TAB_ALIGNMENT
- WD_TAB_LEADER
- WD_TABLE_DIRECTION
- WD_UNDERLINE
名稱解釋
更多編程教學(xué)請(qǐng)關(guān)注公眾號(hào):潘高陪你學(xué)編程