上章写了excel的处理,本文是word的自动化操作~
word自动化流程如下:
1.1 常用语句
使用的库:docx
根据应聘数据,自动生成相对应的聘用信。结合Email,就可实现自动生成各自的聘用信,并自动发送给相应人员。偷偷吐槽一下,之前收到过发错的的应聘信,收到了其他人的,一来会让人觉得公司有点low,二来存在泄漏他人信息的安全危机。如果没有专门的系统使用,就可以用python,快速有准确,老板再也不用担心发错应聘信了。
以下是需要生成的聘用信模板,需要把XXX,yyyy等等换成相应人员信息,生成对应新的聘用信。
import docx
from docx import Document
import time,datetime
import pandas as pd
# 1、导入模板,打印段落内容
doc = docx.Document('聘用信.docx')
'''
for paragraph in doc.paragraphs:
print(paragraph.text) #打印各段落内容文本
a = len(doc.paragraphs)
'''
for i in range(0,len(doc.paragraphs)):
print(i) #打印各段落索引
print(doc.paragraphs[i].text) #打印各段落内容文本
#从上图可以看出,需要替换的是:
## 段落3:当天日期,年、月、日
## 段落4:姓名
## 段落5:姓名
## 段落10:岗位
## 段落16:入职日期,年、月、日
## 段落3:当天日期,年、月、日
today = time.strftime("%Y{y}%m{m}%d{d}",time.localtime()).format(y='年',m='月',d='日') #当天日期
doc.paragraphs[3].text = today #替换段落3
## 段落4:姓名
## 段落5:姓名
## 段落10:岗位
## 段落16:入职日期,年、月、日
## 这些内容是从应聘员工表格中获取,下面读取excel表格获取数据,进行替换
renyuan = pd.read_excel(r'C:\Users\lmy\Documents\临时\python自动化办公培训\应聘员工表.xls')
####先替换第一行测试一下######
## 段落4:姓名
doc.paragraphs[4].text = doc.paragraphs[4].text.replace('XXX',renyuan.iloc[0,0])
## 段落5:姓名
doc.paragraphs[5].text = doc.paragraphs[5].text.replace('XXX',renyuan.iloc[0,0])
## 段落10:岗位
doc.paragraphs[10].text = doc.paragraphs[10].text.replace('XXXX',renyuan.iloc[0,1])
## 段落16:入职日期,年、月、日
doc.paragraphs[16].text = doc.paragraphs[16].text.replace('yyyy',str(renyuan.iloc[0,2].date().year))
doc.paragraphs[16].text = doc.paragraphs[16].text.replace('mm',str(renyuan.iloc[0,2].date().month))
doc.paragraphs[16].text = doc.paragraphs[16].text.replace('dd',str(renyuan.iloc[0,2].date().day))
doc.save('%s聘用信.docx'%(renyuan.iloc[0,0]))
for i in range(0,len(renyuan)):
doc = docx.Document(r'C:\Users\lmy\Documents\临时\python自动化办公培训\聘用信.docx')
doc.paragraphs[3].text = time.strftime("%Y{y}%m{m}%d{d}",time.localtime()).format(y='年',m='月',d='日')
doc.paragraphs[4].text = doc.paragraphs[4].text.replace('XXX',renyuan.iloc[i,0])
doc.paragraphs[5].text = doc.paragraphs[5].text.replace('XXX',renyuan.iloc[i,0])
doc.paragraphs[10].text = doc.paragraphs[10].text.replace('XXXX',renyuan.iloc[i,1])
doc.paragraphs[16].text = doc.paragraphs[16].text.replace('yyyy',str(renyuan.iloc[i,2].date().year))
doc.paragraphs[16].text = doc.paragraphs[16].text.replace('mm',str(renyuan.iloc[i,2].date().month))
doc.paragraphs[16].text = doc.paragraphs[16].text.replace('dd',str(renyuan.iloc[i,2].date().day))
doc.save('%s聘用信.docx'%(renyuan.iloc[i,0]))
# 需要转成pdf文件的可以用下面代码转换
'''
import os,win32com
import win32com.client
from win32com.client import Dispatch,constants,gencache
filename = 'lmy1聘用信.docx'
filepath = os.path.join(os.getcwd(),filename)
doc = wd.Documnets.Open(filepath,ReadOnly=1)
doc.SaveAs(filepath.replace(".docx",".pdf"),17)
doc.close()
'''
# 3、邮件自动发送相应应聘信
# 生成的附件直接发送邮件
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
#设置服务器所需信息
#qq邮箱服务器地址
mail_host = 'smtp.qq.com'
#qq用户名
mail_user = '5********@qq.com'
#密码(部分邮箱为授权码,qq就是)
mail_pass = 'q***********b'
#邮件发送方邮箱地址
sender = '5********@qq.com'
#邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
receivers = ['5********@qq.com']
#设置email信息
message = MIMEMultipart() #创建一个带附件的实例
message['From'] = Header('才华有限公司','utf-8') #发送方信息
message['To'] = Header('应聘人员','utf-8') #接受方信息
subject = '才华有限公司应聘'
message['Subject'] = Header(subject,'utf-8') #邮件主题
#邮件正文内容
message.attach(MIMEText('恭喜入职才华有限公司,具体详见附件','plain','utf-8'))
#构造附件1,传送当前目录下的test.txt文件
att1 = MIMEText(open('lmy1聘用信.docx','rb').read(),'base64','utf-8')
att1['Content-Type'] = 'application/octet-stream'
#这里的filename可以任意写,写什么名字 邮件中就显示什么名字
att1['Content-Disposition'] = 'attachment;filename:"lmy1聘用信.docx"'
message.attach(att1)
#登录并发送邮件
try:
smtpObj = smtplib.SMTP()
#连接到服务器
smtpObj.connect(mail_host,25)
#登录到服务器
smtpObj.login(mail_user,mail_pass)
#发送
smtpObj.sendmail(sender,receivers,message.as_string())
#退出
smtpObj.quit()
print('success')
except smtplib.SMTPException as e:
print('error',e) #打印错误
开通邮件SMTP授权请看:https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=1001256’)
完整版代码
import docx
from docx import Document
import time,datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.header import Header
def generate_doc_email(staff_path,doc_tempo_path):
renyuan = pd.read_excel(staff_path) #读取人员信息数据
#循环每个人员信息,生成相对应的应聘信doc,并发送邮件
for i in range(0,len(renyuan)):
doc = docx.Document(r'C:\Users\lmy\Documents\临时\python自动化办公培训\聘用信.docx')
doc.paragraphs[3].text = time.strftime("%Y{y}%m{m}%d{d}",time.localtime()).format(y='年',m='月',d='日')
doc.paragraphs[4].text = doc.paragraphs[4].text.replace('XXX',renyuan.iloc[i,0])
doc.paragraphs[5].text = doc.paragraphs[5].text.replace('XXX',renyuan.iloc[i,0])
doc.paragraphs[10].text = doc.paragraphs[10].text.replace('XXXX',renyuan.iloc[i,1])
doc.paragraphs[16].text = doc.paragraphs[16].text.replace('yyyy',str(renyuan.iloc[i,2].date().year))
doc.paragraphs[16].text = doc.paragraphs[16].text.replace('mm',str(renyuan.iloc[i,2].date().month))
doc.paragraphs[16].text = doc.paragraphs[16].text.replace('dd',str(renyuan.iloc[i,2].date().day))
doc.save('%s聘用信.doc'%(renyuan.iloc[i,0]))
mail_host = 'smtp.qq.com' #qq邮箱服务器地址
mail_user = '5********@qq.com' #qq用户名
mail_pass = 'q***********b' #密码(部分邮箱为授权码,qq就是)
sender = '5********@qq.com' #邮件发送方邮箱地址
receivers = [renyuan.iloc[i,3]] #邮件接受方邮箱地址,注意需要[]包裹,这意味着你可以写多个邮件地址群发
#设置email信息
message = MIMEMultipart() #创建一个带附件的实例
message['From'] = Header('才华有限公司','utf-8') #发送方信息
message['To'] = Header('应聘人员','utf-8') #接受方信息
subject = '才华有限公司应聘'
message['Subject'] = Header(subject,'utf-8') #邮件主题
message.attach(MIMEText('恭喜入职才华有限公司,具体详见附件','plain','utf-8')) #邮件正文内容
att1 = MIMEText(open('%s聘用信.doc'%(renyuan.iloc[i,0]),'rb').read(),'base64','utf-8') #构造附件1,传送当前目录下的文件
att1['Content-Type'] = 'application/octet-stream'
att1['Content-Disposition'] = 'attachment;filename:"lmy1聘用信.docx"' #这里的filename可以任意写,写什么名字 邮件中就显示什么名字
message.attach(att1)
smtpObj = smtplib.SMTP()
smtpObj.connect(mail_host,25) #连接到服务器
smtpObj.login(mail_user,mail_pass) #登录到服务器
smtpObj.sendmail(sender,receivers,message.as_string()) #发送
doc.Close() #关闭
smtpObj.quit() #退出