安裝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"]
- 添加了一個
1
行3
列的表格棺亭,作為添加表頭
用 - 為表格添加一點樣式
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庹!