Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手

专题概述

本次实验主要介绍Python针对Word办公自动化的需求产生背景及由来及其具体实现。包括但不限于:

  • Word文档模型简介
  • Python-docx库的介结、安装
  • Python-docx库的初步使用方法
  • Python操作Word实现办公自动化案例

专题环境

  • Windows操作系统
  • Python
  • PyCharm
  • Word\Excel\PPT

专题流程

场景引入
Python-docx介绍
Python-docx的使用
自动化案例
拓展训练

专题目标

完成本实验后,您将能够

  • 了解Word文档模型
  • 掌握如何在Windows系统下安装Python-docx库
  • 掌握Python-docx库的基础使用方法
  • 掌握如何给文档添加标题与段落
  • 设置如何给文字设置字体样式(加粗、斜体、设置字体、颜色及大小等)
  • 能够利用Python-docx库结合实际工作需求完成办公自动化操作任务

专题内容

Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第1张图片

任务一、场景引入

【任务目标】

​ 本次任务主要了解为什么需要用到针对Word的办公自动化操作,通过一个实际工作场景切入。

【任务步骤】

小张在一家黄金饰品公司工作,每天上午都需要给大约200个客户发送word版的今日黄金价格信息通知

每份通知文档只有日期,价格,客户名不一样

小张只得每天反复修改wrod文档,每次大概需要2个小时来完成这项重复的工作

如何能够非常高效的完成这件事情呢?

学完今天的内容后,由原来第天要花2个小时完成的事情,变成现在的一键搞定,效率提升了几百倍。

如何做到?

终于找到了 python-docx Python 库,文档齐全,功能强大,用来解决替换问题不在话下。

开始之前,先简单了解下 python-docx !

任务二、python-docx 介绍

【任务目标】

​ 本次任务主要讲解了什么python-docx库,如何安装这个第三方库。同时也简单介结了一下Word文档模型。

【任务步骤】

python-docx 是用于创建可修改 微软 Word 的一个 python 库,提供全套的 Word 操作,是最常用的 Word 工具

2.1、概念

使用前,先了解几个概念:

  • Document:是一个 Word 文档 对象,Document 是独立的,打开不同的 Word 文档,就会有不同的 Document 对象,相互之间没有影响
  • Paragraph:是段落,一个 Word 文档由多个段落组成,当在文档中输入一个回车键,就会成为新的段落,输入 shift + 回车,不会分段
  • Run 表示一个节段,每个段落由多个 节段 组成,一个段落中具有相同样式的连续文本,组成一个节段,所以一个 段落 对象有个 Run 列表

例如有一个 Word,内容是:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第2张图片
word 文档内容则 结构这样划分:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第3张图片
第二个 段落(paragraph),没有内容,所以 节段(run)为空

2.2、安装

可以用 pip 来安装:

pip install python-docx

Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第4张图片
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第5张图片
出现如下图提示,说明安装成功:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第6张图片

2.3、小试牛刀

python-docx 安装后,测试一下:

from docx import Document
doc = Document()
doc.add_paragraph('Hello,Python.')
doc.save("test.docx")
  • 引入 Document 类
  • 定义一个新文档对象 document
  • 想文档中插入一个段落(paragraph)
  • 最后调用文档对象 document 的 save 保存文档
    Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第7张图片执行成功后,在当前main.py所在目录,可以看到新产生的test.docx。用 Word 打开保存的 test.docx 就可以看到:Hello,Python ,具体操作如下图所示:
    Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第8张图片
    Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第9张图片
    Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第10张图片

任务三、python-docx库的使用

【任务目标】

​ 本次任务主要讲解了如何利用Python-docx库操作Word文档。

【任务步骤】

在上面小试牛刀中,介绍了插入段落(paragraph)的用法,下面在介绍一些 python-docx 的其他功能

为了简洁,下面例子中省略了 Document 类的引入和实例化代码,doc为 Document 的实例

3.1、添加标题

默认情况下添加的标题是最高一级的,即一级标题,通过参数 level 设定,范围是 1 ~ 9,也有 0 级别,表示的是段落标题:

# 添加一级标题
doc.add_heading('我是一级标题')
doc.add_heading('我也是一级标题',level=1)
doc.add_heading('我是二级标题', level=2)
doc.add_heading('我是三级标题', level=3)
doc.add_heading('我是段落标题', level=0)

doc.add_paragraph('我是一个普通段落.')
doc.save("test01.docx")

Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第11张图片
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第12张图片
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第13张图片

3.2、文字样式

在前面 python-docx 文档结构图可以看到,段落中,不同样式的内容,被划分成多个 节段(Run),文字样式是通过 节段(Run)来设置的

3.2.1、设置加粗/斜体
from docx import Document
document = Document()


paragraph = document.add_paragraph('添加一个段落') 
# 设置 节段文字为加粗
run1 = paragraph.add_run('我是粗体的')
run1.bold = True
# 设置 节段文字为斜体
run2 = paragraph.add_run('我是斜体的')
run2.italic = True

document.save("demo02.docx")
print("demo02.docx created!")

Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第14张图片

3.2.2、设置字体

设置字体稍微复杂些,例如设置一段文字为 宋体

......
from docx.oxml.ns import qn
paragraph = document.add_paragraph('我的字体是')
paragraph.add_run(' 黑体')
run3 = paragraph.runs[1]
run3.bold = True
run3.font.name = '黑体'
run3._element.rPr.rFonts.set(qn('w:eastAsia'), '黑体')
......

Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第15张图片

3.2.3、设置文字颜色及大小
.....
from docx.shared import RGBColor
from docx.shared import Pt
from docx.oxml.ns import qn


paragraph = document.add_paragraph('我的颜色是')
paragraph.add_run('红色')
run4 = paragraph.runs[1]
font = run4.font
font.name = u'微软雅黑'
run4._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
font.size = Pt(14)
# RGB颜色对照表:http://www.wahart.com.hk/rgb.htm
font.color.rgb = RGBColor(255, 48, 48)
......

Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第16张图片

3.2.4、全局样式设置
document = Document()
# 1,全局设置字体与大小:微软雅黑 14号字
print(document.styles['Normal'].font.name)
document.styles['Normal'].font.name = u'微软雅黑'
document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
document.styles['Normal'].font.size = Pt(14)
document.add_paragraph().add_run("1,我是第一段!")
.....
3.2.5、综合示例

可以动态的给一个文档添加段落、文本并给文本设置样式。

import docx
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.shared import Inches
from docx.shared import Pt
from docx.oxml.ns import qn
# 创建文档
document = Document() 
# 添加第一个段落,并在该段落中添加内容
document.add_paragraph().add_run("1,我是第一段!")  
# document.add_paragraph("1,我是第一段!")  # 与上面的写法等价
# 添加第二个段落,并在该段落中添加内容
run1 = document.add_paragraph().add_run("2,我是第二段!")
# 创建字体对象
font1 = run1.font
# 打印默认字体的名称
print(font1.name)
# 设置run1内容的字体及字号
font1.name = 'Microsoft YaHei UI'
# 设置字体为12号字
font1.size = Pt(12)
# 打印字体
print(font1.name)

# 设置第三段字体
paragraph = document.add_paragraph("3,我是")
run2 = paragraph.add_run("第三段!")
# 设置run2内容的字体及字号
font2 = run2.font
font2.name = 'Microsoft YaHei UI'
font2.size = Pt(14)

# 设置第三段字体,在第三段中添加两个节段
paragraph.add_run("我是")
run3 = paragraph.add_run("微软雅黑")
font3 = run3.font
font3.name = u"微软雅黑"
run3._element.rPr.rFonts.set(qn('w:eastAsia'), u'微软雅黑')
font3.size = Pt(16)

document.save('demo03.docx')
print("docx保存成功!")

Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第17张图片

任务四、自动化案例-1:一键批量自动生成指定的格式的公文

【任务目标】

​ 本次任务主要讲解了如何利用Python-docx库操作Word文档实现自动化的案例。

【任务步骤】

4.1、自动化需求

​ 小张在一家黄金饰品公司工作,每天上午都需要给大约200个客户发送word版的今日黄金价格信息通知每份通知文档只有日期,价格,客户名不一样,小张只得每天反复修改wrod文档,每次大概需要2个小时来完成这项重复的工作。

客户通知的模板如下:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第18张图片

4.2、实现代码

NotifyWord.py

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

price = input('请输入今天的黄金价格:')
customers = ['客户1', '客户2', '客户3', '客户4', '客户5', '客户6', '客户7', '客户8', '客户9']
# today = time.strftime("%Y-%m-%d", time.localtime())
today = time.strftime("%Y/%m/%d", time.localtime())
# today = time.strftime("%Y年%m月%d日", time.localtime())
# today = time.strftime("%Y{y}%m{m}%d{d}", time.localtime()).format(y='年', m='月', d='日')
# 循环创建文档
for customer in customers:
    # 创建文档对象
    document = Document()
    # 设置全局样式
	document.styles['Normal'].font.name='微软雅黑'
	document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'),'微软雅黑')
	document.styles['Normal'].font.size = Pt(21)
	# 创建通知标题
    p1 = document.add_paragraph()
    p1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
    run1 = p1.add_run('关于下达 %s 价格通知' % (today))
    run1.font.size = Pt(28)
    run1.font.bold = True
    p1.space_after = Pt(5)
    p1.space_before = Pt(5)
    # 客户名称
    p2 = document.add_paragraph()
    run2 = p2.add_run(customer + ': ')
    run2.font.name = '仿宋_GB2312'
    run2.element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋_GB2312')
    run2.font.bold = True
	run2.font.color.rgb= RGBColor(255,48,48)
    # 通知内容
    p3 = document.add_paragraph()
    run3 = p3.add_run('  根据公司的安排,为提供优质的客户服务,我单位拟定了今日黄金价格为 %s 元,特此通知。' % (price))
    # 通知落款
    p4 = document.add_paragraph()
    p4.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
    run4 = p4.add_run('(联系人:小张 电话:13633393934)')
    run4.font.name = '仿宋_GB2312'
    run4.element.rPr.rFonts.set(qn('w:eastAsia'), u'仿宋_GB2312')
    # 保存文档
    document.save('./doc/%s-价格通知.docx' % customer)

在项目上击右键,新建doc目录 , 执行代码,效果如下:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第19张图片
运行成功之后:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第20张图片

任务五、拓展训练:自动批量生成学员放假通知单

【任务目标】

​ 本次任务是通过如下练习达到对上述知识技能点掌握的目的。

【任务步骤】

5.1、自动化需求

**自动化任务需求:**自动批量生成学员放假通知单,模板如下:

Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第21张图片

特别说明:

1)假设有10个学生(可以直接写在程序列表中)

2)假设有10个学生家长(家长的名称也可以直接写在程序列表中)

3)运行时提示

请输入放假开始时间(如:2021-7-1):
请输入放假结束时间(如:2021-8-31):
请输入老师名称:

4)最下边落款的时间为当前系统时间

5.2、实现代码

打开Pycharm,进入默认界面,选择 File—>New... ,如下图所示:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第22张图片
在弹出的窗口中选择 Python file ,输入:StudentHolidy,创建StudentHolidy.py文件:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第23张图片
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第24张图片
在其中输入代码如下:

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

students = ['学生A', '学生B', '学生C', '学生D', '学生E', '学生F', '学生G', '学生H', '学生I']
mothers =  ['家长A', '家长B', '家长C', '家长D', '家长E', '家长F', '家长G', '家长H', '家长I']

startDate = input('请输入放假开始时间(如:2021-7-1):')
endDate = input('请输入放假结束时间(如:2021-9-1):')
teacher = input('请输入老师名称:')

# 计算放假结束时间加一天后的入学报到时间
# 伪代码:nextDate = 将endDate这个字符串转换为日期时间类型 + 一天
nextDate = datetime.datetime.strptime(endDate,'%Y-%m-%d')+datetime.timedelta(days=+1)
# 开学时间
openSchool = '{0}月{1}日'.format(nextDate.month,nextDate.day)
# 得到今天的时间
today = time.strftime('%Y年%m月%d日',time.localtime()) 

# 循环创建文档
for i in range(len(students)):
	# 创建文档对象
	document = Document()
	# 向document文档写入数据的过程
	# 设置全局样式
	document.styles['Normal'].font.name='微软雅黑'
	document.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'),'微软雅黑')
	document.styles['Normal'].font.size = Pt(14)
	
	# 创建通知标题
	p1 = document.add_heading('{0}学生放假通知书'.format(students[i]))
	p1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
	
	# 创建抬头
	p2 = document.add_paragraph('尊敬的同学家长:')
	run1 = p2.add_run(mothers[i])
	run1.font.bold = True
	run1.font.color.rgb = RGBColor(255,0,0)
	
	# 通知内容
	p3 = document.add_paragraph()
	p3.add_run('我校根据上级要求,决定从 %s 开始放寒假,下学期于 %s 开学报到。%s 正式上课。' % (startDate,endDate,openSchool))
	
	# 通知落款-1
	p4 = document.add_paragraph() 
	p4.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
	run2 = p4.add_run(today)
	run2.font.name = '宋体'
	run2.element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
	run2.font.size = Pt(14)
	
	# 通知落款-2
	p5 = document.add_paragraph() 
	p5.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
	run3 = p5.add_run(teacher)
	run2.font.name = '宋体'
	run2.element.rPr.rFonts.set(qn('w:eastAsia'),'宋体')
	run2.font.size = Pt(14)
	
	document.save('./docx/{0}-学生放假通知书.docx'.format(students[i]))

在项目Code目录上击右键,新建 docx 目录:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第25张图片
然后再StudentHolidy.py 文件上击右键运行,执行效果如下:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第26张图片
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第27张图片
敲回车执行效果如下:
Python办公自动化实战 04 | Python-docx库:Python与Word的完美结合_综合案例快速上手_第28张图片

你可能感兴趣的:(python,职场和发展,经验分享,pycharm)