<Python啟發(fā)式自動化>之Word常見功能

安裝Python-docx

docx 并非 Python 的標準庫僻肖,屬于第三方擴展,我們通過 pip 命令安裝:

pip install python-docx

如果因為網(wǎng)絡或者其他原因?qū)е?pip 無法正常安裝

請訪問 https://pypi.org/project/python-docx/
手動下載壓縮文件并解壓后安裝

tar xvzf python-docx-{version}.tar.gz
cd python-docx-{version}
python setup.py install

快速開始

新建文檔

from docx import Document
document = Document()

這一步非常簡易毒租,我們申明一個 Document 對象惹谐,如果不傳入docx文檔路徑的話碾篡,默認
打開一個新的空白文檔

這種使用缺省參數(shù)調(diào)起文檔對象的方式大大簡化了
我們的代碼量,變得更加簡單

保存文檔

from docx import Document

document = Document()
document.save("./nihao.docx")

save 方法用于保存 docx 文檔

嘗試寫入標題和內(nèi)容

添加標題

from docx import Document
document = Document()
document.add_heading('地下交通站')
document.add_heading('鼎香樓', level=2)
# document.save("./地下交通站.docx")

進入源碼查看 add_heading 方法

def add_heading(self, text="", level=1):
    """Return a heading paragraph newly added to the end of the document.

    The heading paragraph will contain *text* and have its paragraph style
    determined by *level*. If *level* is 0, the style is set to `Title`. If *level*
    is 1 (or omitted), `Heading 1` is used. Otherwise the style is set to `Heading
    {level}`. Raises |ValueError| if *level* is outside the range 0-9.
    """
    if not 0 <= level <= 9:
        raise ValueError("level must be in range 0-9, got %d" % level)
    style = "Title" if level == 0 else "Heading %d" % level
    return self.add_paragraph(text, style)

可以看到 add_heading 方法接收了兩個參數(shù),
text參數(shù)是標題文本葱椭,而level是等級大小捂寿,默認是 一級標題

添加段落

段落是 docx 文檔中最主要塊級對象,用于寫入正文孵运、圖片秦陋、表格等等

paragraph = document.add_paragraph('賈貴原本是安丘城的一個地痞流氓')

使用 add_paragraph 方法我們可以寫入段落內(nèi)容,
但是我們更多的是想給內(nèi)容指定一些樣式治笨,自定義一些風格驳概。

python-docx支持大部分原生 docx 的文本樣式
,諸如對齊方式旷赖、縮進顺又、行間距、字體大小等孵,字體風格稚照,顏色等等

比如我們準備了一份地下交通站的經(jīng)典語錄

我捂著臉撅起屁股就和他打起來了。
二十年后老子又是一條好漢……奸俯萌。
老子他媽今天不打人果录,老子今天他媽打你。
一流氓二土匪日本鬼子憲兵隊咐熙,警備隊偵緝隊親生兒子維持會弱恒。
建立王道樂土需要牲口,維護新秩序更需要牲口 總之皇軍和牲口是不能分開的棋恼。 皇軍會把牲口當成自己的兄弟斤彼。
我就知道那姑娘長的嘿。
你滴寶刀大大滴好蘸泻,我滴,要了嘲玫。你滴辦公桌大大滴好悦施,我滴,這里辦公去团。你滴老婆大大滴漂亮抡诞,我滴……
真是天下漢奸一般蠢。
對對對土陪,我就是那狗屁賈隊長昼汗。

我們將其寫入一段正文段落并加以修飾

from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import Pt, RGBColor
from docx.oxml.ns import qn

document = Document()


# 全局指定字體
document.styles['Normal'].font.name = u'.萍方-簡'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'.萍方-簡')

header = document.add_heading('地下交通站',level=2)

# 設置標題對齊方式為居中對齊
header_format = header.paragraph_format
header_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

text = '''
我捂著臉撅起屁股就和他打起來了。
二十年后老子又是一條好漢……奸鬼雀。
老子他媽今天不打人,老子今天他媽打你。
一流氓二土匪日本鬼子憲兵隊洲赵,警備隊偵緝隊親生兒子維持會。
建立王道樂土需要牲口鸦做,維護新秩序更需要牲口 總之皇軍和牲口是不能分開的。 皇軍會把牲口當成自己的兄弟谓着。
我就知道那姑娘長的嘿泼诱。
你滴寶刀大大滴好,我滴赊锚,要了治筒。你滴辦公桌大大滴好,我滴舷蒲,這里辦公耸袜。你滴老婆大大滴漂亮,我滴……
真是天下漢奸一般蠢阿纤。
對對對句灌,我就是那狗屁賈隊長。'''

# 申明一個段落
paragraph = document.add_paragraph()

# 設置對齊方式為居中對齊
paragraph_format = paragraph.paragraph_format
paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER

# 設置一個塊對象
run = paragraph.add_run(text)

# 設置字體大小和顏色
run.font.size = Pt(7)
run.font.color.rgb = RGBColor(0x42, 0x24, 0xE9) # RGB 

document.save("./地下交通站.docx")

做了什么

  • document 對象中設置了全局字體欠拾,注意: 如果是docx不自帶的字體風格胰锌,需要自行下載字體到本地以供選擇
  • 設置了一個二級標題
  • 通過 paragraph_format 屬性設置了對齊方式
  • 通過 add_run 添加塊元素并插入準備好的文本
  • 設置了正文內(nèi)容的字體大小和顏色
  • 保存文檔

文檔效果如下

[圖片上傳失敗...(image-7e433b-1626154738679)]

插入圖片

from docx.shared import Inches
document.add_picture('./盛世美顏賈隊長.png', width=Inches(1.0))

通過 add_picture 方法添加一張本地圖片到文檔,
默認docx 庫不支持解析添加在線圖片地址藐窄。

所以如果我們想要添加在線圖片的話可以
先通過獲取該圖片的二進制流內(nèi)容资昧,再通過 add_picture 方法添加到文檔中

import requests,io
from docx.shared import Inches
url = 'https://www.easyicon.net/api/resizeApi.php?id=1311353&size=128'
io_url = io.BytesIO(requests.get(url).content)
# 添加一張圖片
document.add_picture(io_url, width=Inches(1.0))

插入表格

docx文檔中是可以插入和操作表格的

table = document.add_table(rows=2, cols=2)

使用 add_table 方法添加了一個表格,我們試著通過表格的一些屬性和方法來操作單元格

cell = table.cell(0, 1)
cell.text = '嘿荆忍,打起來了嘿'

.text 屬性可以給單元格賦值 (賦值或修改)

  • 0 表示第一行
  • 1 表示第二列

這里表格的行和列索引都是從0開始的

指定寫入行的單元格格带,通過 rows 屬性指定某一行或某些行。然后通過行的 cells 屬性給單元格賦值

row = table.rows[2]
row.cells[0].text = '前幾天最熱的時候我們家熱的快炸了'
row.cells[1].text = '那你開空調(diào)啊'
  • 2 表示指定了表格中的第 3
  • 0 表示寫入了該行的第 1
  • 1 表示寫入了該行的第 2

通過 len 函數(shù)獲取表格中行和列的總數(shù)

row_count = len(table.rows)
col_count = len(table.columns)

逐步添加行和列

當我們無法確定目前文檔表格的行數(shù)時刹枉,可以選擇實時添加行或列叽唱,
這樣可以靈活控制表格的長度和寬度,減少不必要的空行或空列

比如我們不知道數(shù)據(jù)列表的長度或是需要實時添加行操作微宝,
參考以下代碼

items = [
    {"name":"賈貴","desc":"偵緝隊隊長","createDate":"2021-04-20"},
    {"name":"黃金標","desc":"警備隊隊長","createDate":"2021-04-21"},
    {"name":"黑藤","desc":"特務機關長","createDate":"2021-04-22"},
    {"name":"孫友福","desc":"鼎香樓掌柜","createDate":"2021-04-23"},
    {"name":"水根","desc":"鼎香樓大伙計","createDate":"2021-04-24"}
]

# 添加表
table = document.add_table(1, 3)
table.style='Medium Grid 1 Accent 1'

# 表頭
heading_cells = table.rows[0].cells
heading_cells[0].text = '名字'
heading_cells[1].text = '職務'
heading_cells[2].text = '創(chuàng)建時間'

for item in items:
    cells = table.add_row().cells
    cells[0].text = item["name"]
    cells[1].text = item["desc"]
    cells[2].text = item["createDate"]
  • 添加了一個 13 列的表格棺亭,作為添加表頭
  • 為表格添加一點樣式 Medium Grid 1 Accent 1
  • 使用 add_row 方法動態(tài)添加行操作

關于表格樣式列表可以參考 https://www.cnblogs.com/AbnerLc/p/13375707.html

我們還可以通過 len(items[0]) 得到 items 列表中字典的長度來作為列的長度

# 添加表
table = document.add_table(1, len(items[0]))

頁眉和頁腳

有時候我們會給文檔添加頁眉和注腳

添加頁眉

document = Document()
section = document.sections[0]
header = section.header
paragraph = header.paragraphs[0]
paragraph.text = "鼎香樓"
# paragraph.text = "左對齊文本\t居中文本\t右對齊文本"
paragraph.style = document.styles["Header"]

聲明一個 section 并使用 header 屬性為文檔添加頁眉

添加頁腳

footer = section.footer
paragraph = footer.paragraphs[0]
# 居中顯示
paragraph.text = "\t來自地下交通站\t"

只需將 header 換成 footer,為文檔添加頁腳

這里只是列舉了 python-docx 庫的一些常用功能蟋软,
更多的文檔樣式和使用方法讀者可以使用 python-docx 的官方文檔
https://python-docx.readthedocs.io

祝你有個好心情 O庹!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岳守,一起剝皮案震驚了整個濱河市凄敢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌湿痢,老刑警劉巖涝缝,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡俊卤,警方通過查閱死者的電腦和手機嫩挤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來消恍,“玉大人岂昭,你說我怎么就攤上這事『菰梗” “怎么了约啊?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佣赖。 經(jīng)常有香客問我恰矩,道長,這世上最難降的妖魔是什么憎蛤? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任外傅,我火速辦了婚禮,結(jié)果婚禮上俩檬,老公的妹妹穿的比我還像新娘萎胰。我一直安慰自己,他們只是感情好棚辽,可當我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布技竟。 她就那樣靜靜地躺著,像睡著了一般屈藐。 火紅的嫁衣襯著肌膚如雪榔组。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天联逻,我揣著相機與錄音搓扯,去河邊找鬼。 笑死包归,一個胖子當著我的面吹牛擅编,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播箫踩,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谭贪!你這毒婦竟也來了境钟?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤俭识,失蹤者是張志新(化名)和其女友劉穎慨削,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡缚态,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年磁椒,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玫芦。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡浆熔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桥帆,到底是詐尸還是另有隱情医增,我是刑警寧澤,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布老虫,位于F島的核電站叶骨,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏祈匙。R本人自食惡果不足惜忽刽,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望夺欲。 院中可真熱鬧跪帝,春花似錦、人聲如沸洁闰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扑眉。三九已至纸泄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腰素,已是汗流浹背聘裁。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留弓千,地道東北人衡便。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像洋访,于是被迫代替她去往敵國和親镣陕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容