<Python启发式自动化>之Word常见功能

安装Python-docx

docx 并非 Python 的标准库,属于第三方扩展,我们通过 pip 命令安装:

pip install python-docx

如果因为网络或者其他原因导致 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文档路径的话,默认
打开一个新的空白文档

这种使用缺省参数调起文档对象的方式大大简化了
我们的代码量,变得更加简单

保存文档

from docx import Document

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

save 方法用于保存 docx 文档

尝试写入标题和内容

添加标题

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 方法接收了两个参数,
text参数是标题文本,而level是等级大小,默认是 一级标题

添加段落

段落是 docx 文档中最主要块级对象,用于写入正文、图片、表格等等

paragraph = document.add_paragraph('贾贵原本是安丘城的一个地痞流氓')

使用 add_paragraph 方法我们可以写入段落内容,
但是我们更多的是想给内容指定一些样式,自定义一些风格。

python-docx支持大部分原生 docx 的文本样式
,诸如对齐方式、缩进、行间距、字体大小,字体风格,颜色等等

比如我们准备了一份地下交通站的经典语录

我捂着脸撅起屁股就和他打起来了。
二十年后老子又是一条好汉……奸。
老子他妈今天不打人,老子今天他妈打你。
一流氓二土匪日本鬼子宪兵队,警备队侦缉队亲生儿子维持会。
建立王道乐土需要牲口,维护新秩序更需要牲口 总之皇军和牲口是不能分开的。 皇军会把牲口当成自己的兄弟。
我就知道那姑娘长的嘿。
你滴宝刀大大滴好,我滴,要了。你滴办公桌大大滴好,我滴,这里办公。你滴老婆大大滴漂亮,我滴……
真是天下汉奸一般蠢。
对对对,我就是那狗屁贾队长。

我们将其写入一段正文段落并加以修饰

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 添加块元素并插入准备好的文本
  • 设置了正文内容的字体大小和颜色
  • 保存文档

文档效果如下

[图片上传失败...(image-7e433b-1626154738679)]

插入图片

from docx.shared import Inches
document.add_picture('./盛世美颜贾队长.png', width=Inches(1.0))

通过 add_picture 方法添加一张本地图片到文档,
默认docx 库不支持解析添加在线图片地址。

所以如果我们想要添加在线图片的话可以
先通过获取该图片的二进制流内容,再通过 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 = '那你开空调啊'
  • 2 表示指定了表格中的第 3
  • 0 表示写入了该行的第 1
  • 1 表示写入了该行的第 2

通过 len 函数获取表格中行和列的总数

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

逐步添加行和列

当我们无法确定目前文档表格的行数时,可以选择实时添加行或列,
这样可以灵活控制表格的长度和宽度,减少不必要的空行或空列

比如我们不知道数据列表的长度或是需要实时添加行操作,
参考以下代码

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 = '创建时间'

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 方法动态添加行操作

关于表格样式列表可以参考 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

祝你有个好心情 !!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容