19年8月份给业务部门做过python自动化培训(excel、word、email、ppt、微信等操作),懒癌患者到现在才想起来。现把实际会用到的操作代码pou出来~~希望能解决部分日常工作中重复繁琐的工作内容哈。
我只是代码的搬运工,更多内容大家还是求助度娘把(o)/~
一、python自动化办公常涉及模块
- excel
- word
- ppt
- email/WeChat
二、EXCEL基本操作
Make Excel Fly!
excel自动化流程如下:
2.1 常用语句
excel处理的库有很多,xlrd、xlwt、xlswriter、xlwings、openpyxl、pandas、win32等等。这里不逐一介绍哈
#1、excel文件读取
import xlrd
workbook = xlrd.open_workbook('文件路径') #打开文件
workbook.sheet_names #获取所有sheet名称
workbook.nsheets #获取所有sheet数量
workbook.sheets() #获取所有sheet对象
table = workbook.sheet_by_index(0) #通过索引获取sheet
table = workbook.sheet_by_name('sheetName') #通过sheet名称获取sheet
print(table.name,table.nrows,table.ncols) #打印sheet名称、行数、列数
#2、sheet数据读取
table.row_values(0) #获取第1行数据
table.row_values(0,6:10) #获取第1行,7-10列数据
table.row_types(0) #获取第1行数据类型
table.row(0) #获取第1行单元格数据类型和数据
table.row_slice(0) #获取第1行数据类型
#列操作同行操作,把row换成col即可
#3、单元格数据读取
table.cell_value(4,3) #获取单元格的值
#table.cell(4,3).value #同上
#table.row(4)[3].value #同上
table.cell_type(4,3) #获取单元格的类型
#table.cell(4,3).ctype #同上
#table.row(4)[3].ctype #同上
#通过列名获取数据
#1、先读取列名所在行(通常第一行)到一个list中;
#2、根据列名找到在哪一列
list = table.row_values(0) #获取第1行数据
table.col_values(list.index('列名'))
#单元格索引转换
xlrd.cellname(0,0) #0,0转换成A1
xlrd.cellnameeabs(0,0) #0,0转换成$A$1
xlrd.colname(0) #把列由数字转化成字母表示
#4、单元格数据操作
#4.1数据写入
import xlwt
#创建excel文件
workbook_new=copy(xlrd.open_workbook('文件路径')) #f复制已有excel,简洁版:workbook_new=copy('文件路径')
workbook_new=xlwt.Workbook(encoding='UTF-8') #新建工作薄
#创建sheet
worksheet = workbook_new.get_sheet(1)
worksheet = workbook_new.add_worksheet("frist_sheet")
#单元格写入数据
worksheet.write('A1','write something') #写入文本
#worksheet.write(0,0,'write something') #同上
worksheet.write(0,0,0) #写入数字
worksheet.write(0,0,xlwt.Formula(SUM(B1:B2))) #写入函数
worksheet.insert_image(0,0,'test.png') #写入图片
d=workbook.add_format({'num_format':'yyyy-mm-dd'})
worksheet.write(0,0,datetime.datetime.strptime('2020-08-31','%Y-%m-%d'),d) #写入函数
#单元格设置
worksheet.set_row(0,40) #设置第1行行高40
#worksheet.row(0).height(40) #同上
worksheet.set_column('A:B',40) #设置第1-2列列宽40
#worksheet.col(0).width(40) #同上
#单元格自定义格式
'''
常用格式
- 字体颜色: color
- 字体加粗: bold
- 字体大小: font_size
- 日期格式: num_format
- 超链接: url
- 下划线设置: underline
- 单元格颜色: bg_color
- 边框: border
- 对齐方式:align
'''
#方法一:
format = workbook.add_format({'border':1,'font_size':13,'border':True,'align':'center','bg_color':'cccccc'})
worksheet.write(0,0,'write something',format)
worksheet.set_row(0,40,format)
#方法二:
style = xlwt.XFStyle() #初始化样式
font = xlwt.Font() #初始化字体
font.name = '宋体'
font.bold = True
font.underline= True
font.italic= True #斜体
style.font = font
borders = xlwt.Borders() #初始化边框
borders.top = xlwt.Borders.THIN
borders.bottom = xlwt.Borders.THIN
borders.left = xlwt.Borders.THIN
borders.right = xlwt.Borders.THIN
style.borders = borders
alignment = xlwt.Alignment() #初始化对齐
alignment.horz = xlwt.Alignment.HORZ_CENTER #horizontal,水平居中
alignment.vert = xlwt.Alignment.VERT_CENTER #vertical,垂直居中
style.alignment = alignment
worksheet.write(0,0,'write something',style)
#批量向单元格写入数据
worksheet.write_column('A15',[1,2,3,4]) #列写入,从A15开始
worksheet.write_row('A15',[1,2,3,4]) #行写入,从A15开始
#合并单元格写入
worksheet.merge_range(7,8,'merge_range')
#生成图表并插入到excel(高级功能)
#(1)折线图
chart_col = workbook.add_chart({'type':'line'}) #创建一个折线图
chart_col.add_series({'name':'=Sheet1!$B$1','categories':'=Sheet1!$A$2:$A$7','values':'=Sheet2!$B$2:$B$7','line':{'color':'red'}}) #配置第一个系列数据
chart_col.add_series({'name':'=Sheet1!$B$1','categories':'=Sheet1!$A$2:$A$7','values':'=Sheet2!$C$2:$C$7','line':{'color':'red'}}) #配置第二个系列数据
chart_col.set_title({'name':'python_test_chart_line'}) #设置标题
chart_col.set_x_axis({'name':'x_name'}) #设置x轴信息
chart_col.set_y_axis({'name':'y_name'}) #设置y轴信息
chart_col.set_style(1) #设置图表风格
worksheet.insert_chart('A10',chart_col,{'x_offset':25,'y_offset':10} #插入,并设置位移
#柱状图、饼图同操作
worksheet.save('文件路径') #保存
worksheet.close() #关闭
2.2 实例演示
操作:明细数据,根据模板样式进行汇总保存到指定表格中。结合pandas进行数据处理,更便捷哦。
test1.xls 数据根据模板test2.xls加工,导入生成test3.xls
import xlrd
import xlwt
#import numpy as np
import pandas as pd
import xlutils #excel工具库
from xlutils.copy import copy #excel工具库
#1、读取表格
workbook =xlrd.open_workbook('test1.xls',formatting_info=True)
table = workbook.sheet_by_index(0) #获取第一个sheet页
#为了方便进行数据处理,下面用pandas读取数据
data = pd.read_excel('test1.xls')
#2、汇总、加工数据
gb = data.groupby(by='姓名').sum()[['流入资金','流出资金']] #按照姓名加和
gb['净收入']=gb['流入资金']-gb['流出资金'] #加工净收入
gb['姓名'] = gb.index #增加姓名 列,groupby后索引就变成了聚合列了
#3、读取、复制表格模板,写入数据
workbook_2 = xlrd.open_workbook('test2.xls') #打开模板excel
table_2 = workbook_2.sheet_by_index(0)
workbook_temp = copy(workbook_2) #复制excel
table_temp = workbook_temp.get_sheet(0) #获取第一个sheet页
#print(table_2.ncols,table_2.nrows,gb.shape[0])
gb.rename(columns={'流入资金':'收入汇总','流出资金':'支出汇总'}, inplace = True) #修改同模板一样的列名
order = table_2.row_values(1) #获取模板第二行列名
gb = gb[order] #调整列顺序,方面下面插入数据
#数据写入表格
for i in range(2,gb.shape[0]+2): #从第3行开始写起,因为前两行是表头,不操作
for j in range(0,table_2.ncols): #从第1列开始写起
table_temp.write(i,j,str(gb.iloc[i-2,j]))
#将gb中第三行第三列(2,2)写入到sheet中第5行,5列(4,5)
workbook_temp.save('test3.xls')
worksheet.close() #关闭
workbook_temp.close() #关闭
发现导出的数据格式和模板不一样了,要保存和模板一样的格式,1、按照上面介绍的单元格自定义格式,进行处理。
2、使用可保留格式的库开发
之前有项工作就是,每日进行日报加工,然后邮件发送。就是通过python一键实现的,上班摸个鱼不好嘛。
三、福利大放送
可直接用的excel拆分、合并代码(通过bat文件可转化成小程序使用)
import xlrd,xlwt
import os
import pandas as pd
import time
import sys
# import numpy
#打印数据
def ShowExcelInfo(filepath,filename,titlerows):
file_excel = xlrd.open_workbook(os.path.join(filepath, filename))#打开excel
for sheet in file_excel.sheets():#sheet页循环 从某种 角度来说,计算机比人强的地方就在循环上
print("sheet页名字:",sheet.name,"行数",sheet.nrows,"列数",sheet.ncols)
i = 0
for i in range(sheet.nrows):#行的循环
if str(i) == str(titlerows):#判断结束的行
break
else:
print(" ",sheet.row(i))#打印行的内容
#根据某列拆分
def Excelsplit(filepath,filename,splitcolumn):
exceldata = pd.DataFrame(pd.read_excel(os.path.join(filepath, filename)))#读取excel并转换类型
splitlist = list(set(exceldata[splitcolumn]))#将目标列所有数值装入list
curtime = time.strftime("%Y%m%d%H%M%S", time.localtime())#获取当前时间,文件命名时候使用
for split in splitlist:
splitstr = str(split)
splitdata = exceldata[exceldata[splitcolumn] == splitstr]#单独获取某一个数值的数据,例如‘lmy’
splitfilename = splitstr + '['+str(curtime)+']' + filename #命名拆分表格
fullpath = os.path.join(filepath, splitfilename)#获取全路径文件名
splitdata.to_excel(fullpath,splitstr)#保存excel
#筛选特定的列
def ExcelRestric(filepath,filename,restrictlist):
exceldata = pd.DataFrame(pd.read_excel(os.path.join(filepath, filename)))#读取excel并转换类型
curtime = time.strftime("%Y%m%d%H%M%S", time.localtime())#获取当前时间,文件命名时候使用
fullpath = os.path.join(filepath, "[筛选列]"+curtime+filename)#获取全路径文件名
rescolumns = list(restrictlist)#确保类型转换
resdata = exceldata[rescolumns]#另存想要获取的列
resdata.to_excel(fullpath,"筛选列")
#多个excel关联,自选关联方式
def Excelmap(filepath,filename1,filename2,mode):
if mode not in ['inner','left','right','outer']:
print("error!!!")
else:
curtime = time.strftime("%Y%m%d%H%M%S", time.localtime())#获取当前时间
fullfile1 = os.path.join(filepath, filename1)#文件1的路径
fullfile2 = os.path.join(filepath, filename2)#文件2的路径
file1 = pd.DataFrame(pd.read_excel(fullfile1))#读取excel 文件1
file2 = pd.DataFrame(pd.read_excel(fullfile2))#读取excel 文件2
Mapdata = pd.merge(file1, file2, how=mode)#文件处理
fullpath = os.path.join(filepath, "[数据匹配]"+curtime+filename1)#新文件的路径和命名
Mapdata.to_excel(fullpath,"数据匹配")#保存文件
if __name__ == "__main__":
if len(sys.argv) > 2:
print(sys.argv[0],sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4])
if sys.argv[1] == "ShowExcelInfo":
ShowExcelInfo(sys.argv[2], sys.argv[3], sys.argv[4])
elif sys.argv[1] == "Excelsplit":
Excelsplit(sys.argv[2], sys.argv[3], sys.argv[4])
elif sys.argv[1] == "ExcelRestric":
ExcelRestric(sys.argv[2], sys.argv[3], sys.argv[4])
elif sys.argv[1] == "Excelmap":
Excelmap(sys.argv[2], sys.argv[3], sys.argv[4], sys.argv[5])
else:
print("参数错误!!")
else:
print("哇,猴赛雷!!!")