Python自动化之word操作
课前准备
1.python处理Word需要用到 python-docx库,在终端执行如下安装命令
pip3 install python-docx
2.了解python中的部分函数的用法,稍后会用到
1)函数:split()
Python中有split()和os.path.split() 两个函数,具体作用如下:
split():拆分字符串。通过指定分隔符对字符串进行切片,并返回分割后的字符串列表(list)
os.path.split():按照路径将文件名和路径分割开
2)了解python中docx库中部分函数用法
知识要点
1.预热:初步认识docx
(1)新建空白word并插入文字
# 导入库
from docx import Document
# 新建空白文档
doc_1 = Document()
# 添加标题(0相当于文章的题目,默认级别是1,级别范围为0-9)
doc_1.add_heading('新建空白文档标题,级别为0',level = 0)
doc_1.add_heading('新建空白文档标题,级别为1',level = 1)
doc_1.add_heading('新建空白文档标题,级别为2',level = 2)
# 新增段落
paragraph_1 = doc_1.add_paragraph('这是第一段文字的开始\n请多多关照!')
# 加粗
paragraph_1.add_run('加粗字体').bold = True
paragraph_1.add_run('普通字体')
# 斜体
paragraph_1.add_run('斜体字体').italic =True
# 新段落(当前段落的下方)
paragraph_2 = doc_1.add_paragraph('新起的第二段文字。')
# 新段落(指定端的上方)
prior_paragraph = paragraph_1.insert_paragraph_before('在第一段文字前插入的段落')
# 添加分页符(可以进行灵活的排版)
doc_1.add_page_break()
# 新段落(指定端的上方)
paragraph_3 = doc_1.add_paragraph('这是第二页第一段文字!')
# 保存文件(当前目录下)
doc_1.save('D:\\python自动化之word操作\\doc_1.docx')
- 正式:python自动化之word操作
1)整体页面结构介绍
# 导入库
from docx import Document
from docx.shared import RGBColor, Pt, Inches, Cm
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.oxml.ns import qn
# 新建文档(Datawhale)
doc_1 = Document()
# 字体设置(全局)
'''只更改font.name是不够的,还需要调用._element.rPr.rFonts的set()方法。'''
doc_1.styles['Normal'].font.name = u'宋体'
doc_1.styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# 添加标题(0相当于文章的题目,默认级别是1,级别范围为0-9,0时候自动带下划线)
heading_1 = doc_1.add_heading('周杰伦', level=0)
heading_1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 居中对齐,默认居左对齐
# 新增段落
paragraph_1 = doc_1.add_paragraph()
'''
设置段落格式:首行缩进0.75cm,居左,段后距离1.0英寸,1.5倍行距。
'''
paragraph_1.paragraph_format.first_line_indent = Cm(0.75)
paragraph_1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
paragraph_1.paragraph_format.space_after = Inches(1.0)
paragraph_1.paragraph_format.line_spacing = 1.5
text = '中国台湾华语流行歌手、' \
'音乐创作家、作曲家、作词人、' \
'制作人、杰威尔音乐公司老板之一、导演。' \
'近年涉足电影行业。周杰伦是2000年后亚洲流行乐坛最具革命性与指标' \
'性的创作歌手,有“亚洲流行天王”之称。他突破原有亚洲音乐的主题、形' \
'式,融合多元的音乐素材,创造出多变的歌曲风格,尤以融合中西式曲风的嘻哈' \
'或节奏蓝调最为著名,可说是开创华语流行音乐“中国风”的先声。周杰伦的' \
'出现打破了亚洲流行乐坛长年停滞不前的局面,为亚洲流行乐坛翻开了新的一页!'
r_1 = paragraph_1.add_run(text)
r_1.font.size = Pt(10) # 字号
r_1.font.bold = True # 加粗
r_1.font.color.rgb = RGBColor(255, 0, 0) # 颜色
# 保存文件(当前目录下)
doc_1.save('D:\\python自动化之word操作\\bird.docx')
2)字体设置
#导入库
from docx import Document
from docx.oxml.ns import qn
from docx.enum.style import WD_STYLE_TYPE
document = Document() # 新建docx文档
# 设置宋体字样式
style_font = document.styles.add_style('宋体', WD_STYLE_TYPE.CHARACTER)
style_font.font.name = '宋体'
document.styles['宋体']._element.rPr.rFonts.set(qn('w:eastAsia'), u'宋体')
# 设置楷体字样式
style_font = document.styles.add_style('楷体', WD_STYLE_TYPE.CHARACTER)
style_font.font.name = '楷体'
document.styles['楷体']._element.rPr.rFonts.set(qn('w:eastAsia'), u'楷体') # 将段落中的所有字体
# 设置华文中宋字样式
style_font = document.styles.add_style('华文中宋', WD_STYLE_TYPE.CHARACTER)
style_font.font.name = '华文中宋'
document.styles['华文中宋']._element.rPr.rFonts.set(qn('w:eastAsia'), u'华文中宋')
paragraph1 = document.add_paragraph() # 添加段落
run = paragraph1.add_run(u'aBCDefg这是中文', style='宋体') # 设置宋体样式
font = run.font #设置字体
font.name = 'Cambira' # 设置西文字体
paragraph1.add_run(u'aBCDefg这是中文', style='楷体').font.name = 'Cambira'
paragraph1.add_run(u'aBCDefg这是中文', style='华文中宋').font.name = 'Cambira'
document.save('D:\\python自动化之word操作\\字体设置1.docx')
3) 插入图片与表格
#导入库
from docx import Document
from docx.shared import Inches
#打开文档
doc_1 = Document('D:\\python自动化之word操作\\周杰伦.docx') #上面脚本存储的文档
#新增图片
doc_1.add_picture('D:\\python自动化之word操作\\周杰伦.jpg',width=Inches(1.0), height=Inches(1.0))
# 创建3行1列表格
table1 = doc_1.add_table(rows=2, cols=1)
table1.style='Medium Grid 1 Accent 1' #表格样式很多种,如,Light Shading Accent 1等
# 修改第2行第3列单元格的内容为营口
table1.cell(0, 0).text = '营口'
# 修改第3行第4列单元格的内容为人民
table1.rows[1].cells[0].text = '人民'
# 在表格底部新增一行
row_cells = table1.add_row().cells
# 新增行的第一列添加内容
row_cells[0].text = '加油'
doc_1.save('D:\\python自动化之word操作\\周杰伦为营口加油.docx')
4)设置页眉页脚
项目实践
# 导入库
from openpyxl import load_workbook
from docx import Document
from docx.enum.text import WD_PARAGRAPH_ALIGNMENT
from docx.shared import RGBColor, Pt, Inches, Cm
from docx.oxml.ns import qn
path = r'D:\python自动化之word操作\invite'
# 路径为Excel 文件所在的位置,可按实际情况更改
workbook = load_workbook(path + r'\excel到word.xlsx')
sheet = workbook.active # 默认的WorkSheet
n = 0 # 为了不遍历标题(excel的第一行)
for row in sheet.rows:
if n:
company = row[0].value
office = row[1].value
name = row[2].value
date = str(row[3].value).split()[0]
print(company, office, name, date)
doc = Document()
heading_1 = '邀 请 函'
paragraph_1 = doc.add_heading(heading_1, level=1)
# 居中对齐
paragraph_1.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER
# 单独修改较大字号
for run in paragraph_1.runs:
run.font.size = Pt(17)
greeting_word_1 = '尊敬的'
greeting_word_2 = '公司'
greeting_word_3 = ',您好:'
paragraph_2 = doc.add_paragraph()
paragraph_2.add_run(greeting_word_1)
r_1 = paragraph_2.add_run(company)
r_1.font.bold = True # 加粗
r_1.font.underline = True # 下划线
paragraph_2.add_run(greeting_word_2)
r_2 = paragraph_2.add_run(office)
r_2.font.bold = True # 加粗
r_2.font.underline = True # 下划线
r_3 = paragraph_2.add_run(name)
r_3.font.bold = True # 加粗
r_3.font.underline = True # 下划线
paragraph_2.add_run(greeting_word_3)
paragraph_3 = doc.add_paragraph()
paragraph_3.add_run('现诚挚的邀请您于2021年10月27日参加DataWhale主办的享受开源2050活动,地点在北京鸟巢,希望您届时莅临参加。')
paragraph_3.paragraph_format.first_line_indent = Cm(0.75)
paragraph_3.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.LEFT
paragraph_3.paragraph_format.space_after = Inches(1.0)
paragraph_3.paragraph_format.line_spacing = 1.5
paragraph_4 = doc.add_paragraph()
date_word_1 = '邀请时间:'
paragraph_4.add_run(date_word_1)
paragraph_4.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
sign_date = "{}年{}月{}日".format(date.split('-')[0], date.split('-')[1], date.split('-')[2])
paragraph_4.add_run(sign_date).underline = True
paragraph_4.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT
# 设置全文字体
for paragraph in doc.paragraphs:
for run in paragraph.runs:
run.font.color.rgb = RGBColor(0, 0, 0)
run.font.name = '楷体'
r = run._element.rPr.rFonts
r.set(qn('w:eastAsia'), '楷体')
doc.save(path + "\{}-邀请函.docx".format(name))
n = n + 1