19年8月份给业务部门做过python自动化培训(excel、word、email、ppt、微信等操作),懒癌患者到现在才想起来。现把实际会用到的操作代码pou出来~~希望能解决部分日常工作中重复繁琐的工作内容哈。

我只是代码的搬运工,更多内容大家还是求助度娘把(o)/~

一、python自动化办公常涉及模块

  • excel
  • word
  • ppt
  • email/WeChat

如何利用python自动化办公 python办公自动化教程_初始化

二、EXCEL基本操作

Make Excel Fly!

excel自动化流程如下:

如何利用python自动化办公 python办公自动化教程_excel_02

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

如何利用python自动化办公 python办公自动化教程_数据_03

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("哇,猴赛雷!!!")