自动化:
1946年提出,被运用于军事等方面。
办公自动化指的是现在办公和计算机技术结合起来的新型的办公的方式。
“高效的工作”正是自动化解决的问题/
办公自动化的分类:
- 操作Excel: 就业数据分析等
- 操作Word: 考试系统生成Word试卷等
- 操作PPT : 用户画像分析等
使用的模块:
- xlrd模块
- xlwt模块
- smtplib模块
- pywin32模块
- python-ppt模块
- python-docx模块
- pymysql模块
- xlsxwriter模块
1. xlrd模块
- xlrd是第三方模块,读取Excel表格数据
- xlrd常用函数
- xlrd操作Excel列
- xlrd操作Excel行
- xlrd操作Excel单元格
- 安装:
pip install xlrd -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
查看当前电脑已经安装的模块:
pip list
Excel基础:
示例1. xlrd读取excel数据:
import xlrd
# 1.读取Excel
# 1.1 读取文件
data = xlrd.open_workbook('17软件工程学业成绩排名.xls')
# 1.2 工作表是否加载
# print(data.sheet_loaded(0)) # 索引为0的工作表
# 1.3 卸载已经加载的工作表
# data.unload_sheet(0)
# 1.4 找到要操作的工作表
# print(data.sheets()) # 得到所有的工作表
# print(data.sheets()[0]) # 访问第一个工作表的对象
# print(data.sheet_by_name('Sheet1')) # 根据名字去获取工作表
# print(data.sheet_by_index(0)) # 根据索引去获取工作表
# print(data.sheet_names()) # 获取当前所有工作表的名字
# print(data.nsheets) # 当前有多少工作表
# 1.5 操作excel行
# sheet = data.sheet_by_index(0) # 获取第一个工作表
# print(sheet.nrows) # 获取当前sheet下的"有效"行数
# print(sheet.row(0)) # 取到第1行
# print(sheet.row(1)) # 取到第2行
# print(sheet.row_types(3)) # 获取第4行的数据类型(输出的结果中:0表示空,1表示字符串,2表示number, 3表示date, 4表示boolean ,5表示error)
# print(sheet.row(4)[1]) # 获取第5行第2列的数据对象
# print(sheet.row(4)[1].value) # 获取第5行第2列的数据值
# print(sheet.row_values(4)) # 获取第5行所有列的数据值
# print(sheet.row_len(4)) # 获取第5行有多少列
# 1.6 操作Excel列
# sheet = data.sheet_by_index(0) # 获取第一个工作表
# print(sheet.ncols) # 获取工作表的有效列数
# print(sheet.col(1)) # 拿到第二列的数据对象
# print(sheet.col(1)[9].value) # 获取第2列的第10个元素的值
# print(sheet.col_values(1)) # 拿到第2列中所有的数据
# print(sheet.col_types(1)) # 查看第2列的每个单元格数据类型(输出的结果中:0表示空,1表示字符串,2表示number, 3表示date, 4表示boolean ,5表示error)
# 1.7 操作Excel单元格
# sheet = data.sheet_by_index(0) # 获取第一个工作表
# print(sheet.cell(9, 1)) # 第10列,第2行单元格的数据对象
# print(sheet.cell_type(9, 1))# 第10列,第2行单元格的数据类型(输出的结果中:0表示空,1表示字符串,2表示number, 3表示date, 4表示boolean ,5表示error)
# print(sheet.cell(9, 1).ctype)# 第10列,第2行单元格的数据类型(输出的结果中:0表示空,1表示字符串,2表示number, 3表示date, 4表示boolean ,5表示error)
# print(sheet.cell(9, 1).value) # 第10列,第2行单元格的数据值
# print(sheet.cell_value(9, 1)) # 第10列,第2行单元格的数据值
2. xlwt模块
- xlwt是第三方模块,写入Excel表格数据
- 支持创建工作表、指定单元格、指定单元格样式等
- xlwt支持excel的03~2013版Excel。
- 保存格式只支持xls格式,不支持07版以后的xlsx格式
- 安装:
pip install xlwt
示例2. xlwt写入excel数据:
import xlwt
# 写入Excel步骤:创建工作簿、创建工作表、填充工作表内容、保存文件
# 指定样式
titleStyle = xlwt.XFStyle() # 初始化样式
titleFont = xlwt.Font()
titleFont.name = '宋体'
titleFont.bold = True
titleFont.height = 11 * 20 # 20是衡量单位,11是字号
titleFont.colour_index = 0x35 # 这里的颜色不是普通的rgb,要参考XFStyle这个类里面提供的_colour_map_text属性
titleStyle.font = titleFont
# 单元格对齐方式
cellalign = xlwt.Alignment()
cellalign.horz = 0x02 #(水平方向) 这里的对齐方式参考Alignment类的具体属性的值(也可以xlwt.Alignment.xxx)
cellalign.vert = 0x01 #(垂直方向) 这里的对齐方式参考Alignment类的具体属性的值
titleStyle.alignment = cellalign
# 边框
borders = xlwt.Borders()
borders.right = xlwt.Borders.DASHED
borders.bottom = xlwt.Borders.DOTTED
titleStyle.borders = borders
# 定义第一列的背景颜色
dateStyle = xlwt.XFStyle()
bgcolor = xlwt.Pattern()
bgcolor.pattern = xlwt.Pattern.SOLID_PATTERN
bgcolor.pattern_fore_colour = 22 # 背景颜色
dateStyle.pattern = bgcolor
# 1. 创建工作簿
wb = xlwt.Workbook()
# 2. 创建工作表
ws = wb.add_sheet('工作表1')
# 3. 填充数据
ws.write_merge(0, 1, 0, 5, "2020年人民币兑换表", style=titleStyle) # 单元格合并: 前2行合并,前6列合并
# 3.1 写入数据
data = (("日期", "拉拉","啦啦啦", "哈哈", "哈哈哈"),("05/27/2020", 100000, 999999, 666666, 6.3333),("05/27/2020", 100000, 999999, 666666, 6.3333),("05/27/2020", 100000, 999999, 666666, 6.3333),("05/27/2020", 100000, 999999, 666666, 6.3333))
for i, item in enumerate(data):
for j, val in enumerate(item):
if j==0:
ws.write(i + 2, j, val, dateStyle)
else:
ws.write(i + 2, j, val) # 需要行和列的索引(+2是为了跳过前2行,这里我们的前2行有数据了)
# 4. 创建第2个工作表,添加图片
wsimage = wb.add_sheet('兰彩云')
# 写入图片(bitmap格式)
wsimage.insert_bitmap("meinv.bmp", 0, 0) # 从第一行第一列进行插入
# 4.保存
wb.save("2020-money.xls")
结合xlrd和pymysql就可以把excel的数据组装执行导出数据到数据库的功能
封装pymysql:
import pymysql class dbhelper(): def __init__(self, host, port, user, passwd, db, charset ='utf-8'): self.host = host self.port = port self.user = user self.passwd = passwd self.db = db self.charset = charset # 创建一个连接 def connection(self): # 1. 创建连接 self.conn = pymysql.connect(host=self.host, port=self.port,user=self.user, passwd=self.passwd, db=self.db, charset=self.charset) # 2.创建游标 self.cur = self.conn.cursor() # 关闭连接 def closeconnection(self): self.cur.close() self.conn.close() # 查询一条数据 def getonedata(self, sql): try: self.connection() self.cur.execute(sql) result = self.cur.fetchone() self.closeconnection() except Exception: print(Exception) return result
3 xlsxwriter模块(推荐)
- xlsxwriter是python的第三方模块,用于向生成的Excel表格插入数据、图表等操作
- 最终生成xlsx格式的Excel文件
- 功能比xlwt模块更加强大,支持更多的Excel功能
- 100%兼容Excel xlsx文件、支持Excel 2003 2007等版本
- 处理速度更快,支持大文件写入
- 写入时可以启用内存优化模式来快速写入
- 不足:不支持读取和修改Excel文件(读取Excel文件可以使用xlrd模块)
- 安装:
pip install xlsxwriter
示例3. xlsxwriter写入excel数据:
import xlsxwriter
wb = xlsxwriter.Workbook('yinlei.xlsx')
# 设置style格式样式
cell_format = wb.add_format({'bold': True})
cell_format1 = wb.add_format()
cell_format1.set_bold()
cell_format1.set_font_color('orange')
cell_format1.set_font_size(15)
cell_format1.set_align('center')
cell_format2 = wb.add_format()
cell_format2.set_bg_color('#FF00FF')
# 创建工作表
sheet = wb.add_worksheet("yinleisheet")
# 写入
# sheet.write_string() # 还有很多write_xxx()
# 写入单个单元格
sheet.write(0, 0, "2020年", cell_format) # 会帮我们将python的数据类型映射到excel支持的类型方法中
# 合并单元格
sheet.merge_range(1, 0, 2, 2, '全国女朋友彩礼统计', cell_format=cell_format1) # 指定起始的行和列和结束的行、列
data = (
["四川", 5, 15],
["江西", 30, 50],
["乐山", 0, 10],
)
sheet.write_row(3, 0, ["地区", "最低金额(单位:万)", "最高金额(单位:万)"], cell_format=cell_format2)
for index, item in enumerate(data):
sheet.write_row(index+4, 0, item)
# 写入excel公式进行统计数据
sheet.write(7, 1, "=sum(B5:B7)")
sheet.write(7, 2, "=sum(C5:C7)")
# 插入超链接
sheet.write_url(9, 0, "http://yinleilei.com", string="跳转到个人网站")
# 插入图片
sheet.insert_image(10, 0, "plant.png")
# 生成图表
chart = wb.add_chart({'type': 'line'}) ## 折线图:line
chart.set_title({'name': '全国女朋友彩礼统计'})
# X轴Y轴的描述信息
chart.set_x_axis({'name': '地区'})
chart.set_y_axis({'name': '金额'})
# 图表填充数据
chart.add_series({
'name': '最低彩礼',
'categories': '=yinleisheet!$A$5:$A$7', # 用Excel公式取得数据A5-A7的单元格,或者通过索引的方式获取数据像下面的values一样
'values': ['yinleisheet', 4, 1, 6, 1] # 指定工作表,选取起始行是4,起始列1到起始行6,起始列为1之间的数据
})
chart.add_series({
'name': '最高彩礼',
'categories': '=yinleisheet!$A$5:$A$7', # 用Excel公式取得数据A5-A7的单元格,或者通过索引的方式获取数据像下面的values一样
'values': ['yinleisheet', 4, 2, 6, 2],# 指定工作表,选取起始行是4,起始列1到起始行6,起始列为1之间的数据
'data_labels': {'value': True}, # 每个柱状图上显示数字
})
sheet.insert_chart('E4', chart=chart)
# 关闭文件
wb.close()
更多图表配置可查看官网文档
扩展:使用smtplib发送邮件
一个qq邮箱可以有多个授权码
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
from email.mime.application import MIMEApplication
# 发送邮件和附件
host_server = 'smtp.qq.com' # 主机地址(qq邮箱为例 )
sender = '[email protected]'# 发件人邮箱(记得邮箱要取开启stmp服务并获取授权码)
# 发件人邮箱的密码(qq邮箱的授权码)
code = '你的授权码'
# 收件人邮箱
# user1 = '[email protected]'
user2 = '[email protected]'
# users = ['[email protected]', '[email protected]']
# users.append(user1)
# users.append(user2)
# 准备邮件数据:标题、内容、附件
mail_title = 'python自动化办公测试'
mail_content = '梅花香自苦寒来~'
attachment = MIMEApplication(open('yinlei.xlsx', 'rb').read())
attachment.add_header('Content-Disposition','attachment', filename='自动办公测试文件')
#SMTP
smtp = smtplib.SMTP(host_server)
smtp.login(sender, code )
msg = MIMEMultipart() # 带邮件的实例
msg['Subject'] = mail_title
msg['From'] = sender
msg['To'] = user2
msg.attach(MIMEText(mail_content))# 正文内容
msg.attach(attachment)# 添加附件
smtp.sendmail(sender, user2, msg.as_string())
4 python-docx模块
- word的自动化
- 针对手动创建批量制式Word文件、修改现有大量word文件存在的共性问题
- python-docx是第三方模块,用于自动化生成和修改word文档
- 安装:
pip install python-docx
示例4. python-docx读写word
from docx import Document
from docx.shared import Pt,RGBColor
from docx.enum.style import WD_STYLE_TYPE
# Word文档字体和Pt字体大小的对照表
# 八号 5
# 七号 5.5
# 小六 6.5
# 六号 7.5
# 小五 9
# 五号 10.5
# 小四 12
# 四号 14
# 小三 15
# 三号 16
# 小二 18
# 二号 22
# 小一 24
# 一号 26
# 小初 36
# 初号 42
# 1. 创建一个文档对象
document = Document() #新建文档对象
# Document('已经存在的.docx')#读取已经存在的文档
# 2. 写入内容
document.add_heading('我爱你', level=2) # 标题,级别为h2
# word文档的样式处理(可以统一样式)[内置样式或者自定义样式]
style = document.styles.add_style('textstyle', WD_STYLE_TYPE.PARAGRAPH)
# print(style.style_id)
# print(style.name)
style.font.size = Pt(5)
#删除样式
# document.styles['textstyle'].delete()
# 段落
p1 = document.add_paragraph('我爱你,像风走过了3000里! 如果某一天,你不喜欢我了,我希望先开口的人是我,而不是你。渣男不渣,只是他们的心碎成了很多片。',style='textstyle')
p1.insert_paragraph_before("baby, i want to say you :")
format = p1.paragraph_format
format.left_indent = Pt(20) # 缩进
format.right_indent = Pt(20) # 缩进
# 首行缩进
format.first_line_indent = Pt(20)
#设置行间距
format.line_spacing = 1.5
#追加段落
run = p1.add_run('耳旁软语是你,声嘶力竭也是你。爱的是你,离开的也是你。曾共度两三年的是你,而今老死不相往来也是你。')
run.font.size = Pt(12)
run.font.name = '微软雅黑'
run.font.color.rgb=RGBColor(235,33,24)
run1 = p1.add_run('只要最后是你就好。')
run1.bold = True
run1.font.underline = True
run1.font.italic = True
# 插入图片(指定宽高)
document.add_picture('plant.png', Pt(20), Pt(30))
# 插入表格
table = document.add_table(rows=1, cols=3, style='Medium List 1') #表格样式这里我使用的是内置样式,可以查阅官方文档
# 构建表格
header_cells = table.rows[0].cells
header_cells[0].text = '地区'
header_cells[1].text = '最低彩礼'
header_cells[2].text = '最高彩礼'
# 为表格插入数据
data =(
["四川", 5, 15],
["江西", 30, 50],
["乐山", 0, 10],
)
for item in data:
rows_cells = table.add_row().cells # 添加并构建表格
rows_cells[0].text = str(item[0])
rows_cells[1].text = str(item[1])
rows_cells[2].text = str(item[2])
# 获取word文档中的表格
print(len(document.tables[0].rows)) # 打印总行数
print(len(document.tables[0].columns)) # 打印总列数
#cell
print(document.tables[0].cell(0,2).text)#获取表格第一行第3列的内容
# 3. 保存文档
document.save('yinlei.docx')
扩展:Word转PDF(pywin32模块包含了windows几乎所有API)
from win32com.client import constants, gencache
import os
# 单个文件的转换
def createPdf(wordPath, pdfPath):
word = gencache.EnsureDispatch("Word.Application") # 创建Word程序对象
doc = word.Documents.Open(wordPath, ReadOnly=1) # 读取word文件
# 转换方法
doc.ExportAsFixedFormat(pdfPath, constants.wdExportFormatPDF) # 更多信息访问office开发人员中心文档
word.Quit()
# createPdf('E:\PycharmProjects\WorkAuto\yinlei.docx','E:\PycharmProjects\WorkAuto\yinlei.pdf' )
# 多个文件的转换
# print(os.listdir('.')) #当前文件夹下的所有文件
wordfiles = []
for file in os.listdir('.'):
if file.endswith(('.doc','.docx')):
wordfiles.append(file)
# print(wordfiles)
for file in wordfiles:
filepath = os.path.abspath(file)
index = filepath.rindex('.')
pdfpath = filepath[:index]+'.pdf'
createPdf(filepath, pdfpath)
5 python-pptx模块
- 针对批量PPT的创建和修改i、大量图片、文字的写入、准确无误的插入图标等数据
- python-pptx是第三方模块、自动生成和更新PowerPoint(.pptx)文件
- 安装:
pip install python-pptx
内置模板:
示例5. python-pptx操作ppt
import pptx
from pptx.util import Inches, Pt # 英寸
from pptx.enum.shapes import MSO_SHAPE
from pptx.dml.color import RGBColor
from pptx.chart.data import CategoryChartData
from pptx.enum.chart import XL_CHART_TYPE
from pptx.enum.chart import XL_LEGEND_POSITION
# 步骤:
# 1. 得到演示文稿的对像
prs = pptx.Presentation()
# 修改现有的ppt文件Presentation('xxx.pptx')
# 2. 写入操作
slide = prs.slides.add_slide(prs.slide_layouts[0]) #插入一张幻灯片 slide_layouts是微软ppt软件内置的ppt模板集合,通过索引访问具体使用哪个内置模板
prs.slides.add_slide(prs.slide_layouts[1])
prs.slides.add_slide(prs.slide_layouts[2])
# 删除幻灯片
print(len(prs.slides))
del prs.slides._sldIdLst[1]
print(len(prs.slides))
# 给某个幻灯片操作
text1 = slide.shapes.add_textbox(Inches(5),Inches(5),Inches(5),Inches(5))
text1.text = 'i am yinlei'
p1 = text1.text_frame.add_paragraph()
p1.text = '我是段落1'
p1.add_run().text = '结束'
title_shape = slide.shapes.title
title_shape.text = 'title one'
slide.shapes.placeholders[1].text = 'title two'
# 添加图形到ppt(自选图形)
shape = slide.shapes.add_shape(MSO_SHAPE.RECTANGLE,Inches(2),Inches(2),Inches(5),Inches(3))
# 设置图形的填充和边框
fill = shape.fill
fill.solid()
fill.fore_color.rgb=RGBColor(255,0,0)
line = shape.line
line.color.rgb = RGBColor(55,3,5)
line.width = Pt(2)
# 添加表格
table = slide.shapes.add_table(3,3,Inches(2),Inches(2),Inches(4),Inches(2)).table
table.cell(1,0).text = 'name'
table.cell(1,1).text = 'age'
table.cell(1,2).text = 'class'
table.cell(2,0).text = 'yinlei'
table.cell(2,1).text = '21'
table.cell(2,2).text = '1班'
# 合并单元格
cell = table.cell(0,0)
cell1 = table.cell(0,2)
cell.merge(cell1)
table.cell(0,0).text='student info'
#取消合并
# print(cell.is_merge_origin) # 是否合并的
# cell.split()
# 插入图表
chart_data = CategoryChartData()
chart_data.categories = ['月份','一月份','二月份']
chart_data.add_series('2020', (300,400,500))
chart_data.add_series('2019', (500,300,200))
chart = slide.shapes.add_chart(XL_CHART_TYPE.LINE, Inches(2),Inches(2),Inches(6),Inches(4),chart_data).chart
chart.has_title = True
chart.chart_title.text_frame.text = '销售额'
chart.has_legend = True # 显示图例
chart.legend.position = XL_LEGEND_POSITION.RIGHT
# 3. 保存ppt文件
prs.save('yinlei.pptx')