文章目录
前言
其实Python作为一个解释性的语言却能发展的这么迅速,与其强大的库有密不可分的联系,特别是现在的人工智能的大火,基本上大家用的应该都是Python语言吧。另外,由于库的不断丰富,导致运用Python的地方的确蛮多的,而且,在这些领域用的还十分不错,算是一大形势吧。然后我想在弄一点关于办公自动化的代码,其实这个应用前景还是特别大的,想很多广告都是诸如学好Python,我只要半个小时完成工作,其他时间都在喝咖啡,刷视频;而别人工作一天,加班加点还没做完。
所以想在这记录一点自己之前学的内容,算是再重温一下。
一.Excel自动化操作
1.2 读
# 读取excel表格
import xlrd
data = xlrd.open_workbook("../data/测体温.xls")
"""
获取工作簿(book)中的工作表sheet
以下三个函数会返回一个xlrd.sheet.sheet()对象
"""
# # 通过索引顺序获取
# table = data.sheets()[0]
# # 通过索引顺序获取
# table = data.sheet_by_index(0)
# 通过名称获取
table = data.sheet_by_name("Sheet1")
# 返回book中所有工作表的名字
names = data.sheet_names()
print(names)
# ['Sheet1', 'Sheet2', 'Sheet3']
"""
工作表中的行/列的操作
"""
# 获取该sheet中的有效行数
nrows = table.nrows
print(nrows)
row_index, col_index = 0, 0
# 获取某行信息
# print(table.orw(row_index))
print(table.row_slice(row_index))
# 获取某列信息
# print(table.col(col_index))
print(table.col_slice(col_index))
# 返回某行的数据类型列表
print(table.row_types(row_index, start_colx=0, end_colx=None))
print(table.row_types(1, start_colx=0, end_colx=None))
# 返回某行的数值
print(table.row_values(row_index, start_colx=0, end_colx=None))
# 返回某行的有效单元格长度
print(table.row_len(row_index))
1.2 写
import xlwt
# 创建一个workbook 设置编码
workbook = xlwt.Workbook(encoding="utf-8")
# 创建一个worksheet
worksheet = workbook.add_sheet("国贸写字楼")
# 写入excel,参数对应 行 , 列,值
worksheet.write(0, 0, label="人员")
# 保存文件
workbook.save("../data/测体温2.xls")
""" 设置字体样式 """
# 初始化样式
style = xlwt.XFStyle()
# 为样式创建字体
font = xlwt.Font()
font.name = "Times New Roman"
# 加粗
font.bold = True
# 下划线
font.underline = True
# 斜体字
font.italic = True
# 修改样式
style.font = font
worksheet.write(0, 1, "体温", style)
workbook.save("../data/测体温2.xls")
""" 设置单元格宽度 """
# worksheet = workbook.add_sheet("世贸天阶")
worksheet.write(0, 2, "时间")
# 设置单元格宽度
worksheet.col(0).width = 3333
workbook.save("../data/测体温2.xls")
""" 添加日期到单元格 """
import datetime
# 获取样式
style = xlwt.XFStyle()
# Other options: D-MMM-YY, D-MMM, MMM-YY,h:mm:ss, h:mm, M/D/YY h:mm,
style.num_format_str = "M/D/YY"
worksheet.write(1, 2, datetime.datetime.now(), style)
workbook.save("../data/测体温2.xls")
""" 想单元格添加一个公式 """
worksheet.write(1, 1, 37.4)
worksheet.write(2, 1, 36.5)
# 求两个单元格的平均值
worksheet.write(3, 1, xlwt.Formula("AVERAGE(B2,B3)"))
workbook.save("../data/测体温2.xls")
""" 向单元格添加一个链接 """
worksheet.write(1, 3, xlwt.Formula('HYPERLINK("http://www/baidu.com"; "baidu")'))
workbook.save("../data/测体温2.xls")
""" 合并列和行 """
# write_merge(行开始,行结束, 列开始,列结束,“数据内容”)
# 创建字体
font = xlwt.Font()
# 加粗
font.bold = True
stylle = xlwt.XFStyle()
style.font = font
worksheet.write_merge(4,5,0,2,"备注:需要检查是否佩戴口罩", style)
workbook.save("../data/测体温2.xls")
""" 给单元格添加边框和背景色 """
# 边框样式
borders = xlwt.Borders()
borders.left = xlwt.Borders.DASHED
borders.right = xlwt.Borders.DASHED
borders.top = xlwt.Borders.DASHED
borders.bottom = xlwt.Borders.DASHED
borders.left_colour = 0x40
borders.right_colour = 0x40
borders.top_colour = 0x40
borders.bottom_colour = 0x40
# 创建样式
style = xlwt.XFStyle()
style.borders = borders
worksheet.write(1, 0, "张飞", style)
worksheet.write(2, 0, "关羽", style)
workbook.save("../data/测体温2.xls")
二. Word自动化操作
from docx import Document
from docx.shared import Inches
# 空白文档
document = Document()
# document = Document("./test.docx") # 打开原有文档
paragraph = document.add_paragraph("基于Python的办公自动化处理")
paragraph = document.add_paragraph("段落1:word自动化")
document.add_section() # 添加新章节
paragraph = document.add_paragraph("章节2-1")
document.add_section() # 添加新章节
paragraph = document.add_paragraph("章节3-1")
sections = document.sections # 返回所有章节引用的对象
print('章节数 =', len(sections)) # 返回章节总数
# 得到指定section
section = sections[0] # 返回指定章节的对象
section = document.sections[-1] # 返回文档的最后一个章节
# 得到section的信息,1英寸=914400像素
new_height = section.page_height
new_width = section.page_width
print("Section页面高 = {}, Section页面宽 = {}".format(new_height, new_width))
print("左边距={}, 右边距={}".format(section.header_distance, section.footer_distance))
# 添加标题
document.add_heading("标题:楼宇进出人员名单",level=0)
# 添加表格
table = document.add_table(rows=3,cols=3)
# 返回行对象
row = table.rows[0]
# 给行对象的第n个单元格赋值
row.cells[0].text = "姓名"
row.cells[1].text = "温度"
row.cells[2].text = "时间"
# 返回表格的单元格对象,并赋值
cell = table.cell(1, 0)
cell.text = "张飞"
cell = table.cell(2, 0)
cell.text = "关羽"
# 添加图片--添加的图片以原大小显示
document.add_picture("../imgs/word自动化.jpg")
# 保存文件 (最好每次都操作,以免出现不必要的错误)
document.save("../data/test.docx")
三. PDF自动化
3.1 提取完整表格
import pdfplumber # 主要是用来提取表格
import pandas as pd
filename = "../data/tangmumao.pdf"
with pdfplumber.open(filename) as pdf:
# 创建一个空的DataFrame,然后再添加数据
df = pd.DataFrame(columns=["ID", "企业名称"])
for page in pdf.pages:
#
text = page.extract_text() # 提取文字
table = page.extract_tables() # 提取表格
for t in table:
# 得到的table是嵌套list类型,转化成DataFrame类型,方便后续处理
# 每页的table
temp_df = pd.DataFrame(t[0:], columns=["ID", "企业名称"])
print(temp_df)
df = df.append(temp_df, ignore_index=True)
# df = df.merge([df, temp_df])
# 保存文件
df.to_csv("../data/认真名单.csv", index=False)
3.2 PDF的旋转
import PyPDF2 # 主要是用于PDF的旋转,合并和拆分等大的操作
# 对PDF文档进行旋转
def PDFrotate(origFileName, newFileName, rotation):
pdfFile = open(origFileName, "rb") # 打开文件,以二进制读取方式
pdfReader = PyPDF2.PdfFileReader(pdfFile) # 读取文件
pdfWrite = PyPDF2.PdfFileWriter() # 文件写入函数
# 对每一页进行旋转
for page in range(pdfReader.numPages): # 对每一页进行操作
pageObj = pdfReader.getPage(page) # 页数读取
pageObj.rotateClockwise(rotation) # 页面的角度旋转
pdfWrite.addPage(pageObj) # 内容的重新写入
# 保存文件
newFile = open(newFileName, "wb") # 将新文件写入新名字的pdf
pdfWrite.write(newFile) # 将内容写入
pdfFile.close() # 关闭原来的文件
newFile.close() # 关闭新生成的文件
# 写上需要旋转的PDF,旋转后的PDF的名字,旋转的角度
PDFrotate("../data/tangmumao.pdf", "../data/tangmumao_rotate.pdf", 90)
四. Email自动化
-
使用Python实现自动化邮件发送,可以让你摆脱繁琐的重复性业务,可以节省非常多的时间。
-
Python有两个内置库:smtplib和email,能够实现邮件功能,smtplib库负责发送邮件,email库负责构造邮件格式和内容。
-
邮件发送需要遵守SMTP协议,Python内置对SMTP的支持,可以发送纯文本邮件、HTML邮件以及带附件的邮件。
# 1、先导入相关的库和方法
import smtplib
import email
from email.mime.text import MIMEText # 负责构造文本
from email.mime.image import MIMEImage # 负责构造图片
from email.mime.multipart import MIMEMultipart # 负责将多个对象集合起来
from email.header import Header
# 2、设置邮箱域名、发件人邮箱、邮箱授权码、收件人邮箱
# SMTP服务器,这里使用163邮箱
mail_host = "smtp.163.com"
# 发件人邮箱
mail_sender = "发件人邮箱@163.com"
# 这是邮箱授权码,不是邮箱密码.
mail_license = "邮箱授权码"
# 收件人邮箱,可以为多个收件人
mail_receivers = ["收件人邮箱1","收件人邮箱2"]
# 3、构建MIMEMultipart对象代表邮件本身,可以往里面添加文本、图片、附件等
mm = MIMEMultipart('related')
# 4、设置邮件头部内容
# 邮件主题
subject_content = """那个男孩对我说,有事情找你。"""
# 设置发送者,注意严格遵守格式,里面邮箱为发件人邮箱
mm["From"] = "sender_name<发件人邮箱>"
# 设置接受者,注意严格遵守格式,里面邮箱为接受者邮箱
mm["To"] = "receiver_1_name<接受者邮箱1>,receiver_2_name<接受者邮箱2>"
# 设置邮件主题
mm["Subject"] = Header(subject_content, 'utf-8')
# 5、添加正文文本
# 邮件正文内容
body_content = """土豆土豆,我是地瓜,收到请回答!"""
# 构造文本,参数1:正文内容,参数2:文本格式,参数3:编码方式
message_text = MIMEText(body_content,"plain","utf-8")
# 向MIMEMultipart对象中添加文本对象
mm.attach(message_text)
# 6、添加图片
# 二进制读取图片
image_data = open('tom.jpg','rb')
# 设置读取获取的二进制数据
message_image = MIMEImage(image_data.read())
# 关闭刚才打开的文件
image_data.close()
# 添加图片文件到邮件信息当中去
mm.attach(message_image)
# 7、添加附件(excel表格)
# 构造附件
atta = MIMEText(open('员工信息.xlsx', 'rb').read(), 'base64', 'utf-8')
# 设置附件信息
atta["Content-Disposition"] = 'attachment; filename="员工信息.xlsx"'
# 添加附件到邮件信息当中去
mm.attach(atta)
# 8、发送邮件
# 创建SMTP对象
stp = smtplib.SMTP()
# 设置发件人邮箱的域名和端口,端口地址为25
stp.connect(mail_host, 25)
# set_debuglevel(1)可以打印出和SMTP服务器交互的所有信息
stp.set_debuglevel(1)
# 登录邮箱,传递参数1:邮箱地址,参数2:邮箱授权码
stp.login(mail_sender,mail_license)
# 发送邮件,传递参数1:发件人邮箱地址,参数2:收件人邮箱地址,参数3:把邮件内容格式改为str
stp.sendmail(mail_sender, mail_receivers, mm.as_string())
print("邮件发送成功")
# 关闭SMTP对象
stp.quit()
五. 实战:爬取一个睡前小故事并发送给指定的人
# 1. 返回url的内容
import requests
def getHTMLText(url):
headers = {'User-Agent':'Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50',}
try:
r = requests.get(url, headers=headers, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "爬取失败"
# 2.选取一个随机的爬取对象
import random
page_num = random.randint(1,30)
if page_num==1:
url='http://www.tom61.com/ertongwenxue/shuiqiangushi/index.html'
else:
url = 'http://www.tom61.com/ertongwenxue/shuiqiangushi/index_'+str(page_num)+'.html'
html=getHTMLText(url)
# 3. 获取爬取的链接
import bs4
base_url = 'http://www.tom61.com/'
soup = bs4.BeautifulSoup(html,'lxml')
txt_box = soup.find('dl',attrs={'class':'txt_box'})
a_tags = txt_box.find_all('a')
urllist = []
for link in a_tags:
urllist.append(base_url+link.get('href'))
# 4. 随机选取一个小故事
story_item = random.choice(urllist)
# 5. 获取网页的内容并解析放在content里
html = getHTMLText(story_item)
text = []
soup = bs4.BeautifulSoup(html,'lxml')
tags = soup.find('div',class_='t_news_txt')
for i in tags.findAll('p'):
text.append(i.text)
contents = "\n".join(text)
# 6. 以contents为内容发送邮件给女盆友就大功告成!
import zmail
# 使用邮件账户名和邮箱的授权码登录服务器
server = zmail.server('邮件账户名', '邮箱的授权码')
mail = {
'subject': '睡前小故事', # 邮件的标题
'content_text': contents, # 邮件的文字内容
}
# 发送邮件
ret = server.send_mail(['接受者的邮箱'], mail)
print('发送结果:', ret)
总结
应该全是干货,可以直接那来用的那种,特别是最后一个小案例,比较好用。当然了,我也在改进,能否在智能一点,一起加油!