python-docx處理word文檔

更多內(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 安裝特占,如下:
    pip install python-docx
    
    如果同時(shí)安裝了 python2python3 那么 pip 可能不能用糙置,可以使用 pip3 來(lái)安裝,如下:
    pip3 install python-docx
    
  • python-docx 也可以使用 easy_install 來(lái)安裝是目,如下:
    easy_install python-docx
    
  • 如果不能使用 pipeasy_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

枚舉的文檔

名稱解釋

官網(wǎng)解釋


更多編程教學(xué)請(qǐng)關(guān)注公眾號(hào):潘高陪你學(xué)編程

image

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末林艘,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子混坞,更是在濱河造成了極大的恐慌狐援,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件究孕,死亡現(xiàn)場(chǎng)離奇詭異啥酱,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)厨诸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)镶殷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人微酬,你說(shuō)我怎么就攤上這事绘趋。” “怎么了颗管?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵陷遮,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我垦江,道長(zhǎng)帽馋,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任比吭,我火速辦了婚禮绽族,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衩藤。我一直安慰自己吧慢,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布赏表。 她就那樣靜靜地躺著娄蔼,像睡著了一般怖喻。 火紅的嫁衣襯著肌膚如雪底哗。 梳的紋絲不亂的頭發(fā)上岁诉,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音跋选,去河邊找鬼涕癣。 笑死,一個(gè)胖子當(dāng)著我的面吹牛前标,可吹牛的內(nèi)容都是我干的坠韩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼炼列,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼只搁!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起俭尖,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氢惋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后稽犁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體焰望,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年已亥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了熊赖。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡虑椎,死狀恐怖震鹉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捆姜,我是刑警寧澤传趾,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站娇未,受9級(jí)特大地震影響墨缘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜零抬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一镊讼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧平夜,春花似錦蝶棋、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)兼贸。三九已至,卻和暖如春吃溅,著一層夾襖步出監(jiān)牢的瞬間溶诞,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工决侈, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留螺垢,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓赖歌,卻偏偏與公主長(zhǎng)得像枉圃,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子庐冯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355