目录
前言
一、python-docx库简介
二、读写Word文档
2.1 创建Word文档对象
2.2 获取Word文档中的对象
2.3 将数据写入Word文档
三、修改Word文档样式
四、使用Word模板
4.1 创建Word模板文件
4.2使用Word模板文件
五、自动生成数据分析报告
本文小结
前言
声明:本文的内容学习绝大多数来源于廖茂文的《Python自动化办公》一书。
为了避免歧义,本文中Word表示Word软件本身,Word文档表示Word软件中的文档。
python使用python3版本。程序编程使用pycharm软件。要实现python对Word的操作首先要安装python-docx库。
在软件中下载安装依赖两种方式:
(1)使用pycharm导入python-docx库在file-setting-python Interpreter中点击‘+’输入想要导入的库,如:导入python-docx库,操作如下图所示。
(2)若没有该库还向程序导入这个库,代码会有红线提示报错,鼠标指向红线处有会提示下载安装该库,如下图。该方法在安装某些包的时候系统可能会安装错,建议使用第一种方法。
一、python-docx库简介
在程序中导入python-docx库实现创建、修改Word(.docx)文件。注意:python-docx只支持操作*.docx文件格式的Word文档。
二、读写Word文档
2.1 创建Word文档对象
调用Document方法创建Word文件对象。该方法使用场景如下:
(1)创建空Word对象
from docx import Document#创建文件对象document = Document()#保存文件对象document.save('new.docx')
(2)获取已有的Word文件对象
from docx import Documentdoc = Document('exist.docx') #exist.docx为文件名
(3)使用计算机本身的Word来创建word文档,使用前需要安装pypiwin32第三方库,如下代码进行Word文档的文件格式由*.doc转为*docx,我这里使用的是绝对地址,若Word文件和py文件在同一目录(相对地址)就直接写入文件名即可。
from win32com import clientfrom docx import Document#路径doc_path = r'D:\python project\exist.doc'docx_path = r'D:\python project\new_exist.docx'#获取Word应用程序对象Word = client.Dispatch('Word.Application')#打开对应的Word文档doc = Word.Documents.Open(doc_path)#另存到docx_path中,12表示docx文件格式doc.SaveAs(docx_path,12)#关闭Word文档doc.Close()#退出软件Word.Quit()
2.2 获取Word文档中的对象
在一个Word文档中会有很多的对象,如段落对象,表格对象和文本框对象等等。接下来我们要获取这些对象,并对这些对象进行操作。
(1)获取段落对象
使用*.paragraphs获取文档全部对象,*.paragraphs[a]获取下标为a的段落对象。
from docx import Documentdoc = Document('exist.docx') #exist.docx为文件名#遍历Word文档中的段落for p in doc.paragraphs:#输出Word文档中的段落内容print(p.text)
(2)获取表格对象
获取表格对象,遍历所有单元格,输出数据。
from docx import Documentdoc = Document('table.docx')tables = doc.tables#获取文档中全部所有的表格对象table = tables[0] #获取下标为0的表格values = []#遍历表格中所有的单元格for row in table.rows:#遍历所有行对象for cell in row.cells:#遍历行中所有单元格对象values.append(cell.text) #将单元格中的文本内容添加到列表中values = ' '.join(values) #调用join方法将这一行中所有单元格内容用' '连接成字符串重新存放到列表中print(values)values = []
比较两个表格对象,找出不同的单元格位置,代码如下。操作前先安装deepdiff第三方库。导入依赖后,调用DeepDiff方法。
from docx import Documentfrom deepdiff import DeepDiffdef get_doc_values(path):doc = Document(path)tables = doc.tablestable = tables[0]all_values = []for row in table.rows:values = []for cell in row.cells:values.append(cell.text)all_values.append(values)return all_valuestable1 = get_doc_values('table.docx')table2 = get_doc_values('table_modify.docx')ddiff = DeepDiff(table1,table2)print(ddiff)
(3)获取文本框对象
children = doc.element.body.iter()#获取所有目录对象for child in children:# 通过类型判断目录if child.tag.endswith('textbox'): #判断是否是文本框目录i = []for ci in child.iter():#遍历文本框目录中的内容if ci.tag.endswith('main}r'): #筛选出是文本内容片段i.append(ci.text) #将文本内容片段组成列表print("".join(i)) #输出该文本框的内容
2.3 将数据写入Word文档
(1)将文字写入Word文档中
python-docx提供了add_heading、add_paragraph等方法将文字类型数据以不同形式添加到Word文档中。
doc = Document()doc.add_heading('一级标题',level=1)#添加标题p2 = doc.add_paragraph('第二个段落')#添加段落p1 = p2.insert_paragraph_before('第一个段落')p3 = doc.add_paragraph('新段落')#追加内容p3.add_run('加粗').bold = Truep3.add_run('以及')p3.add_run('斜体').italic = Truedoc.save('new1.docx')
(2)将图片写入Word文档中
python-docx提供了add_picture(‘图片地址’,width=*,hight=*)方法把图片添加到Word中。
doc = Document()doc.add_picture('student_score.png',width=Inches(1.25))
(3)将表格写入Word文档中
python-docx提供了add_table(rows=*,cols=*,style= *)方法把图片添加到Word中。
doc = Document()#创建table,设置table样式table = doc.add_table(rows=3,cols=4,style = 'Table Grid')
向单元格中加入添加数据,两种方法如下代码:
#第一种方法:先获取行,再获取改行中对应的单元格row = table.row[0]row.cells[0].text = '第一行第一列'#第二种方法:直接指定行号与列号cell = table.cell(0,1)cell.text = '第一行第二列'
将图片添加到表格中,需要通过追加添加的方式实现,代码如下:
#获取单元格中的段落对象p = cell.paragraphs[0]#获取追加对象,也就是后面会说的内联对象run = p.add_run()run.add_picture('1.png',width=Inches(1.25))
三、修改Word文档样式
Word支持很多样式,通过不同的样式可以帮助用户突出Word文档中的不同内容。python-docx支持Word中的部分样式,虽然不是所有样式,但基本够用。
文本格式
(1)块对象
块对象一般包括标题、段落、图片、表格、有序列表与无序列表。块对象的属性指定了块对象所在的位置,如缩进、段落之间的段落间距等,常用的属性由alignment(对齐方式)、index(缩进)、pace(行间距)等。示例代码如下:
from docx.enum.text import WD_ALIGN_PARAGRAPH...#P为段落对象,设置段落水平居中对齐p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.CENTER#设置段落左对齐p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.LEFT#设置段落右对齐p.paragraph_format.alignment = WD_ALIGN_PARAGRAPH.RIGHT
(2)内联对象
块对象的所有内容都包含在内联对象中,一个块对象由一个或多个内联对象组成。内联对象一般包括文字、句子、段落等,通常通过内联对象的相关属性来指定字体的样式,如粗体、斜体、大小等。示例代码如下:
from docx.shared import Pt...run= p.add_run('内联对象') #p为段落对象font = run.font #获取对象的属性font.size = Pt(35) #设置字体大小font.italic = True #设置字体为斜体
Word文档样式
Word文档中常见的样式由段落样式、字符样式、表格样式等,python-docx库将样式定义在styles属性中,但它并不包含Word中所有的样式。示例代码如下:
from docx import Documentfrom docx.enum.style import *doc = Document()styles = doc.styles#获取文档所有的样式#遍历所有样式for style in styles:if style.type == WD_STYLE_TYPE.TABLE: #筛选出表格类型的所有样式doc.add_paragraph(f"表格样式名称:{style.name}")table = doc.add_table(3,3,style = style) #将表格设置成该样式cells = table.rows[0].cellscells[0].text = '第一列内容'cells[1].text = '第二列内容'cells[2].text = '第三列内容'doc.add_paragraph('\n')doc.save('show_all_table_style.docx')
四、使用Word模板
4.1 创建Word模板文件
第一步 :选中任意符号(这里选中-),插入-文档部件-域
第二步:选"MergeField"--域名输入name--确定
最后:重复相同操作,设置好需要的域名
4.2使用Word模板文件
使用Word模板文件快速生成千分劳动合同文件,这有个Excel表,里面由所有员工的信息,现在把这些用于生成所有人的合同。代码如下:
import pandas as pdfrom mailmerge import MailMerge#读取员工基本信息表对象job_seekers = pd.read_excel('求职者.xlsx')template = '合同.docx' #选择模板doc = MailMerge(template) #根据模板创建模板对象#将数据填写到Word文档中def merge(laber_name):doc.merge(name=laber_name,time = '.10') #生成一份Word文档#遍历员工信息for laber_name in job_seekers['name'].items():merge(laber_name)
五、自动生成数据分析报告
数据分析报告生成是常见的工作任务,下面演示如何将大量数据快速转化为有价值的数据分析报告。
将学生成绩数据(如下图)自动生成数据分析报告。
代码如下:
import pandas as pdimport matplotlib.pyplot as pltfrom docx import Document#获取xlsx对象students = pd.read_excel('student_score.xlsx')#就地排序students.sort_values(by='Score',inplace=True,ascending=False)#绘制柱状图plt.bar(students['Name'],students['Score'],color='orange')plt.title('Student Score',fontsize=16)plt.xlabel('Name')plt.ylabel('Score')plt.xticks(students.Name,rotation='90')plt.tight_layout()plt.savefig('student_score.png')######制作分析报告#######doc = Document()doc.add_heading('数据分析报告',level=0)#获取绝对位置第一的信息first_student = students.iloc[0,:]['Name']first_score = students.iloc[0,:]['Score']p = doc.add_paragraph('分数排在第一位的学生是')p.add_run(str(first_student)).bold =Truep.add_run(',分数为')p.add_run(str(first_score)).bold =Truep1 = doc.add_paragraph(f'总共有{len(students["Name"])}名学生参加了考试,学生考试总体情况:')table = doc.add_table(rows=len(students["Name"])+1,cols=2)table.style = 'Light Shading Accent 1'table.cell(0,0).text = '学生姓名'table.cell(0,1).text = '学生分数'for i,(index,row) in enumerate(students.iterrows()):table.cell(i+1,0).text = str(row['Name'])table.cell(i+1,1).text = str(row['Score'])doc.add_picture('student_score.png')doc.save('student_score_analyze.docx')print("Done!")
效果如下图: