Word文档自动化
hi,少年。之前我们学习了Excel文档的自动化操作,这节课我们讲讲如何使用Python控制Word文档
您可以登录1024fun乐学编程主页学习Python基础课程,还可以学习完整的自动化办公课程。
http://www.eluzhu.com:1818/
安装Python-docx第三方库
呦呵,机灵了。操作Word我们要用到Python-docx。它是Python的第三方库之一,主要用来对Word文档进行相关操作。如果你使用1024ide-Python版本,这些库都是自动安装好的。如果你使用其他编辑器,可以使用pip install Python-docx 命令进行安装
创建空白Word文档
首先我们学习如何创建空白Word文档。
导入安装好的Python-docx库,Python-docx 库拥有许多方法,这里用到的是Document类, 创建 Word 文档代码如下:
from docx import Document #导人库 document = Document() #创建 word 文档 #加载已存在的 word 文档 document = Document(r"E:\1024IDE\e9.docx")
from docx import Document表示从docx模块中导入Document类,创建实例化对象 document, 如果需要编辑的Word文档己存在,则在Document(中添加 Word文档路径,路径存在绝对路径和相对路径,绝对路径是确切的地址,如C:\Windows\addins\xxx.doex。相对路径就是相对于当前文件的路径,如./A/xxx.docx。
保存文档
打开一个Word文档,编辑完后,需要执行保存命令,否则文件内容将会丢失,保存文档的代码如下:
document.save(r"E:\1024IDE\e9.docx")
添加标题
除了一些很短的文章,大多数文章的正文都分为几个部分,每部分都有一个标题。标题分为0到9级,从高到低排列,省略不写默认1级,0级标题下自带一行下划线。
新增标题代码如下:
#标题添加问题 document.add_heading("我是默认1级标题") document.add_heading("我是0级标题") document.add_heading("我是1级标题") document.add_heading("我是2级标题") document.add_heading("我是3级标题")
添加标题调用document的add heading方法,设置需要添加的标题及标题等级、在标题添加代码add_heading(“标题内容”,int)中, int是整数0到9, 0级是最高级别, 9级是最低级别,默认级别为1级,使用0级时会附带下划线样式。在文章中,一级标题为文章的大标题,其次依次使用一级、三级标题。level是add_heading方法的属性, level = 2表示2级标题, level可写可不写,此时已完成创建标题的相关代码工作,整个程序的效果如图
添加段落
在Word文档中,段落是最常见的,是构建文章的基础,创建段落的代码如下:
paragraph = document.add_paragraph("我是A段落") paragraph = document.add_paragraph("我是B段落")
用add_paragraph方法添加段落,输入段落内容,可以直接写入字符串,或者用text参数设置段落的内容,如paragraph = document.add_paragraph(text = '这是第一个段落')。仅插入段落不对其进行样式设置,段落内容将会与左边距对齐。
效果如图
将此段落插入到上一个段落前面,代码如下:
prior_paragraph = paragraph.insert_paragraph_before("我会将段落插入在我上一个段落上面") paragraph = document.add_paragraph("我是C段落")
paragraph.insert_paragraph_before方法可以根据单词字面意思理解,在段落之前插入一个段落, 默认情况下在最后一个段落之前添加一个段落,效果如图
如果在其他段落之前添加段落用paragraphs获取段落下标,再针对某一个段落之前插入,例如:共有5个段落,需要在第二个段落之前插入一个段落,代码如下:
para = document.paragraphs[1] para.insert_paragraph_before("Hello World")
当需要在段落后面追加内容时,用paragraph.add_run(追加的内容)对段落继续进行编辑。
添加分页符
当前页面内容未满或已满,而想把接下来的内容放在下一页时,需要用到分页符,添加一个分页符的代码如下:
#这是一个分更符,用来断开页面 document.add_page_break() paragraph = document.add_paragraph("因为上面有分页符,所以我们自动加入到下一页")
add_page_break 是添加分页符,为了能清晰看到已经成功添加一个分页符,在此处添加一个段落。效果如图
那这次课程我们把这两块结合起来,将Excel表格中的数据,分别导入到每个Word中。
思路:
(1)获取工作簿中的信息。
(2)用二维列表存储每一位学生数据。
(3)获取Word文档中段落数据。
(4)将表格中每位同学的信息存入Word文档中对应内容。
(5)保存文件。
案例简介
本案例为学生在校证明模板渲染,提取学生信息表所有学生信息,将提取的每一位学生数据填入对应的在校证明Word文档,主要用docx2python第三方库处理大量数据。
创建程序执行入口和读取表中数据的函数,导入对应模块,代码如下:
import xlwings as xw #起别名 def read_sheet(): #Python序执行入口 if __name__=="__main__": read_sheet() #调用函数
调用read_sheet()函数打开原工作簿,获取工作簿中所有学生数据信息, sheet_list接收数据,封装遍历sheet_list。循环便伦理所有信息,将数据存入sheet_dic字典,然后存储在list_value列表中,例如: sheet_list = [{"name":"张三","jibie":2},{"name":"杨亮","jibie":3}], name为字典的键,学生姓名为值,具体代码如下:
def read_sheet(): list_value = [] app = xw.App(visible = True,add_book = False) #1.打开跟工作薄 workbook = app.books.open(r"E:\1024IDE\学生信息表.xls") sheet = workbook.sheets[0] #封装判表 sheet_list = sheet.used_range.value for i in range(1,len(sheet_list)): #创建空字典 sheet_dic = {} #构建字典 for j in range(0,len(sheet_list[0])): if type(sheet_list[i][j]) == float: sheet_dic[sheet_list[0][j]] = str(sheet_list[i][j])[:-2] else: sheet_dic[sheet_list[0][j]] = sheet_list[i][j] list_value.append(sheet_dic) print(list_value) write_data(list_value)
循环遍历构建字典,直接遍历输出结果与工作簿中数据会有差异,需要 if 判断数据类型并强制类型转换,可以通过print输出检验结果.
创建save_close()函数对文件保存和退出程序,代码如下:
def save_close(app.workbook): workbook.close() арр.quіt app.kill()
定义write_data()函数,将数据写入Word模板中,采用多层循环嵌套模式循环追历信息,替换Word中的值。具体代码如下:
from docx import Document def write_data(sheet_list_value): for sheet_dic_value in sheet_list_value: #打开原有 Word 文档 document = Document(r"E:\1024IDE\在校证明.docx") for para in document.paragraphs: #runs一方面可以将字符词组分开,另一方面防止文字样式改变 for run in para.runs: for k,v in sheet_dic_value.items(): run.text = run.text.replace(k,v) document.save(r"E:\1024IDE\在校证明.docx" + sheet_dic_value["name"] + "_" + sheet_dic_value["sxh"] + ".docx") print(sheet_dic_value["name"] + "的材料正在保存中...")
创建write_data() 函数对数据进行读写保存, 遍历Word文档中所有段落信息, 每一个段落用run对象保证文字内容和格式的准确性。items) 方法把字典中每对key和value组成一个元组, 并把这些元组放在列表中返回, 循环遍历数据赋值给k和v.run.text.replace(k, v) 将文本中的内容进行替换。打开文档与保存文档是同一级别, 对文档进行命名和保存, 用print函数了解文档保存的进程。效果如图
你可以自己练习一下今天的任务,看看还能不能在原来代码的基础上,加入更多的功能。
您可以登录1024fun乐学编程主页学习Python基础课程,还可以学习完整的自动化办公课程。
http://www.eluzhu.com:1818/