办公自动化——Python操作Excel案例

目录

案例1:批量创建工作簿、工作表

案例2:将指定工作簿指定工作表下语文、数学两列成绩同时大于等于80的记录写入新工作簿

案例3:判断语文和数学两科之和属于哪个级别

案例4:统计出开始达标的月份以及业绩,其中每个人累计业绩大于等于1000则表示达标

 案例五:统计“优良中差”等级出现的次数

案例六:汇总每个人的总成绩

案例七:判断指定姓名在指定日期是否值班

案例八:筛选各工作表中符合条件的值

案例九:统计出大于等于2万的记录到新表

案例十:提取产品最后的记录

案例十一:统计身份、客户名称、订单编号三列中唯一值

案例十二:查询未发货订单

案例十三:字典添加

案例十四:统计各日期的销售数据

案例十五:统计各省各公司总业绩

案例十六:判断指定项目是否存在

案例十七:多行多列求唯一值

案例十八:统计每个月每个战队的人数

案例十九:求每个人不达标的月份

案例二十:定义函数与使用1

案例二十一:函数与定义与使用2

案例二十二:函数定义与使用3

案例二十三:匿名函数使用

案例二十四:每月大于等于100的记录


案例1:批量创建工作簿、工作表

import xlwt 
x,y = 2015,0 #初始化变量,现在需要创建2015年到2018年每个月的工作表
while x<2018:
    wb = xlwt.Workbook(encording = 'utf-8')#创建工作簿
    x+=1
    while y<12:
        y+=1
        ws = wb.add_sheet('%d 年%d 月'%(x,y))#创建工作表
    y = 0 #初始化月份的变量,每一年创建12个月
    wb.save('%d 年.xls'%x) #保存工作簿
    

案例2:将指定工作簿指定工作表下语文、数学两列成绩同时大于等于80的记录写入新工作簿

import xlrd,xlwt 
wb = xled.open_workbook('工作簿.xls') #读取工作簿文件
ws = wb.sheet_bu_name('数据')#读取工作表
nwb = xlwt.Workbook(encording = 'utf-8') #创建工作簿
nws = nwb.add_sheet('数据') #创建工作表
n,m = 0,0 #初始化变量 两个变量分别用于读数的行号和写入的行号
while n<ws.nrows-1:#开始循环数据,其中ws.nrows-1为原始数据表中所有数据的行数
    n+=1
    if ws.cell_value(n,1)>=80 and ws.cell_value(n,2)>=80: #根据数据所在的单元格判断对应的数据是否满足条件
        m+=1
        nws.write(m,0,ws.cell_value(n,0))#在新工作表中写入满足条件的数据,写入第一列数据
        nws.write(m,1,ws.cell_value(n,1))#写入第二列数据
        nws.write(m,2,ws.cell_value(n,2))#写入第三列数据
nws.write(0,0,'姓名')#写入标题
nws.write(0,1,'语文')#写入标题
nws.write(0,2,'英语')#斜入标题
nwb.save('筛选数据.xls')
       

案例3:判断语文和数学两科之和属于哪个级别

import xlrd #导入读取模块
from xlutils.copy import copy #导入复制模块
wb = xlrd.open_workbook('工作簿.xls')#打开工作簿
ws = wb.sheet_by_name('data')#读取工作表
nwb = ws.copy(ws)#复制工作簿
nws = nwb.get_sheet('data')#读取工作表
n = 0 #初始化变量用于控制读取原始数据的行数
while n<ws.nrows-1:
    n+=1
    subtotal = ws.cell_value(n,1)+ws.cell_value(n,2)#对指定数据进行处理
    if subtotal >= 180:
        nws.write(n,3,'优')
    elif subtotal >= 160:
        nws.write(n,3,'良')
    elif subtotal >=120:
        nws.write(n,3,'种')
    else:
        nws.write(n,3,'差')
nwb.save('数据.xlsx')

案例4:统计出开始达标的月份以及业绩,其中每个人累计业绩大于等于1000则表示达标

import xlrd 
from xlutils.copy import copy 
wb = xlrd.open_Workbook('工作簿.xls')
ws = wb.sheet_by_name('数据')
nwb = copy(ws)
nws = nwb.get_sheet('数据')
subtotal,n = 0,0
for i in range(1,ws.nrows): #遍历行号
    for c in range(1,13): #遍历列号
        subtotal+=ws.cell_value(r,c)
        if subtotal >= 1000:
            n+=1
            nws.write(n,0,ws.cell_value(n,0))#在第一列中写入数据
            nws.write(n,1,'%d 月份' %c)
            nws.write(n,2,suntotal)
            break #退出当前循环(每一列循环一次)
    subtotal = 0
nwb.save('数据.xlsx') 

 案例五:统计“优良中差”等级出现的次数

import xlrd 
wb = xlrd.open_workbook('工作簿.xls')
ws = wb.sheet_by_name('数据')
n,m = 0,0
for l in '优良中差':
    while n<ws.nrows-1:
        n+=1
        m+=ws.cell_value(n,1).count(l) #累计等级次数
    print(m)
    n,m = 0,0

案例六:汇总每个人的总成绩

#方法一
import xlrd 
from xlutils.copy import copy 
wb = xlrd.open_workbook('工作簿.xls') 
ws.wb.sheet_by_name('数据')
nwb = copy(wb)
nws = nwb.get_sheet('数据') 
n=0,m=0 #初始化变量,n用于控制原始数据行号,m用于控制新表中的数据
while n<ws.nrows-1:
    n+=1
    l=ws.cell_value(n,1).split('-')[1::2] #提取想要的数据
    for v in l:
        m+=int(v)
    nws.write(n,0,ws.cell_value(n,0))#写入数据
    nws.write(n,1,m)
    m=0
nwb.save('数据统计.xls')
#方法二

import xlrd 
from xlutils.copy import copy 
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.shet_by_name('数据')
nwb=copy(wb)
nws=nwb.get_sheet('数据')
col=ws.col_value(1)[1:] #所需数据提取
subtotal,n = 0,0
for v in col:
    for score in v.split('-')[1::2]:
        subtotal+=int(score)
    n+=1
    nws.write(n,0,ws.cell_value(n,0))
    nws.write(n,1,subtotal)
    subtotal=0
 nwb.save('数据统计.xls')

案例七:判断指定姓名在指定日期是否值班

import xlrd 
from xlutils.copy import copy 
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
nwb=copy(wb)
nws=nwb.geet_sheet('数据')
r=0
while r<nrows-1:
    r+=1
    row= ws.row_values(r)
    if "小明" in row:
        nws.write(r,6,'是')
    else:
        nws.write(r,6,'否')
nwb.save('数据统计.xls')
    

案例八:筛选各工作表中符合条件的值

所用知识点:列表推导式

import xlrd,xlwt
wb=xlrd.open_workbook('工作簿.xls')
nwb=xlwt.Workbook(encording='utf-8')#创建新的工作簿
nws=nwb.add_sheet('数据')#在新工作簿中新增工作表
r=0 
for ws in wb.sheets():#循环遍历工作表
    col=ws.col_values(1)[1:]#读取指定数据
    l=[str(int(amount)) for amount in in col if amount >=20000] #使用列表推导式求对应的结果
    r+=1
    nws.write(r,0,ws.name)
    nws.write(r,1,'、',.join(l))
nwb.save('数据统计.xls')
    

案例九:统计出大于等于2万的记录到新表

使用知识点:列表推导式;表格中数据提取

import xlrd,xlwt 
wb=xlrd.open_workbook('工作簿.xls')
nwb=xlwt.Workbook(encoding=utf-8)#创建新工作簿
nws=nwb.add_shert('数据')
r=0,n=0 #初始化变量
for ws in wb.sheets():#遍历工作簿中的所有工作表
    col0=ws.col_values(0)[1:]
    col1=ws.col_values(1)[1:]
    l=[[x,y] for x,y in zip(col0,col1) if y>=20000]
    for l1 in l:
        n+=1
        nws.write(n,0,ws.name)
        nws.write(n,l1[0])
        nws.write(n,2,l1[1])
nws.write(0,0,'月份')
nws.write(0,1,'日期')
nws.write(0,2,'金额')
nwb.save('数据统计结果.xls')

案例十:提取产品最后的记录

使用知识点:字典、数据提取处理

import xlrd 
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
r=0
d=dict() #创建空字典,用于存放字典数据
while r <ws.nrows-1:
    key=ws.celll_value(r,0)#cell_value用于提取单元格的值,里面的参数为行列的编号
    val=ws.cell_value(r,1)
    d[key]=val #赋值key的值
    r+=1
print(d)

案例十一:统计身份、客户名称、订单编号三列中唯一值

使用知识:字典

import xlrd,xlwt
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
nwb=xlrd.Workbook(encoding='utf-8')
nws=nwb.add_sheet('数据')
l=[ws.col_value(0),ws.col_value(1),ws.col_value(3)]
d=dict.fromkeys(zip(*l)) #赋值字典的值,dict.fromkeys 第一个参数是一个列表或者元组,里面的值为key,第二个参数是所有key的value值
r=0 #用于控制新数据写入的行数
for x in d:
    nws.write(r,0,x[0])
    nws.write(r,1,x[1])
    nws.write(r,2,x[2])
    r+=1
nwb.save('结果.xls')
    

案例十二:查询未发货订单

在工作簿中有三个表,“全部订单”中显示了所有的订单,“已发货”显示已发货的订单,现需在“未发货”工作表中统计出未分货的订单

import xlrd 
from xlutils.copy import copy 
wb=xlrd.open_workbook('工作簿.xls')
ws1=wb.sheet_by_name('全部订单')
ws2=wb.sheet_by_name('已发货')
nwb=copy(wb)
nws=nwb.get_by_name('未发货')
l1=[ws1.col_values(0),ws1.col_values(1),ws1.col_values(2)]#取出数据表中的第一列、第一列数据、第三列 数据放在列表中
l2=[ws2.col_values(0),ws2.col_values(1),ws2.col_values(2)]
d1=dict.fromkeys(zip(*l1)) #组合数据表中第一列、第二列、第三列数据  {('省份', '客户名称', '订单编号')}
d2=list(dict.fromkeys(zip(*l2)))[1:] #指定组合后的数据放在列表中而不是字典中,同时数据不需要第一行数据
    for x in d2:
        d1.pop(x)
r=0
for x in d1:
    nws.write(r,0,x[0])
    nws.write(r,1,x[1])
    nws.write(r,2,x[2])
    r+=1
nwb.save('订单.xls')

案例十三:字典添加

import xlrd 
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
r=0
d=dict()
while r<ws.nrows-1:
    r+=1
    item=ws.row_values(r)[1:]
    if item[0] in d.keys():#判断键在字典中是否存在
        d[item[0]]+=item[1]
    else:
        d[item[0]]=item[1]
print(d)

案例十四:统计各日期的销售数据

import xlrd 
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
r=0
d={}
while  r<ws.nrows-1:
    r+=1
    key=ws.cell_value(r,0)
    value=ws.cell_value(r,1)
    if key in d.keys():
        d[key]+=[int[value]]
    else:
        d[key]=[int(value)]
for k in d:
    print(k,[sum(d[k]),max(d[k]),min(d[k]),len(d[k])]) #d[k]是以k为键的所有值

案例十五:统计各省各公司总业绩

需求介绍:

1、原始数据 字段省份、公司、日期、订单编号、出库单号、金额

2、需求:将每个省份分工作表,每个工作表中统计每个公司的销售总金额

import xlrd
import xlwt
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
nwb=xlwt.Workbook(encoding='utf-8')
r=0
d={}
while r<ws.nrows-1:
    r+=1
    l=ws.row_values(r)#按行取数据,每一行存放在一个列表中
    if (l[0],l[1]) in d.key(): #l[0] 地区 l[1]公司名称
        d[(l[0],l[1])]+=l[5]
    else:
        d[(l[0],l[1])]=l[5]
l1 = dict.fromkeys([x for x,y in d.keys()]).keys() #l1 数据中所有的地区
r=0
for s in l1:
    nws=nwb.add_sheet(s)
    nws.write(0,0,'省份')
    nws.write(0,1,'公司名')
    nws.write(0,2,'总金额')
    l2=[[x[0],x[1],y] for x,y in d.item() if x[0]==s]
    for val in l2:
        r+=1
        nws.write(r,0,val[0])
        nws.write(r,1,val[1])
        nws.write(r,2,val[2])
    r=0
nwb.save('汇总数据表.xls')

案例十六:判断指定项目是否存在

使用知识点:集合 

集合性质 无序,具有去重功能

import xlrd,xlwt 
from xlutils.copy import copy 
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
nwb = copy(wb)
nws=nwb.get_sheet('Sheet1')
r=0
while r<ws.nrows-1:
    r+=1
    v=ws.cell_value(r,1)
    if set(v.split('\'))=={'钢琴','绘画','书法','武术'}:
        nws.write(r,2,'全部')
    else:
        nws.write(r,2,'部分')
nwb.save('结果.xls')

案例十七:多行多列求唯一值

知识点:利用集合的去重性 

import xlrd,xlwt
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('名次表')
nwb=xlwt.Workbook(encoding='utf-8')
nws=nwb.add_sheet('数据')
c=0
s=set()
while c<ws.ncols-1:
    c+=1
    s1=set(ws.col_values(c)[1:])
    s.update(s1)
l=list(s)
for n in range(len(s)):
    nws.write(n+1,0,n+1)
    nws.write(n+1,1,l[n])
nws.write(0,0,'编号')
nws.write(0,1,'姓名')
nwb.save('结果.xls')

案例十八:统计每个月每个战队的人数

import xlrd,xlwt
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
nwb=xlwt.Workbook(encoding='utf-8')#创建新工作簿
nws=nwb.add_sheet('数据')#创建新工作表
r=0
while r<ws.nrows-1:
    r+=1
    l=ws.row_values(r)
    l1=[x,split('-')[1] for x in l[1].split(',')]
    l2=[l[0],'/'.join({'%s:%d 人'%(x,l1.count(x)) for x in l1})]#数据处理与数据拼接
    nws.write(r,2,l2[0])
    nws.write(r,2,l2[1])
nwb.save('结果.xls')

案例十九:求每个人不达标的月份

import xlrd,xlwt
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
nwb=xlwt.Workbook(encoding='utf-8')
nws=nwb.add_sheet('结果')
col1=ws.col_values(0)[1:]#姓名
col2=ws.col_values(1)[1:]#月份
s=set(zip(col1,col2))#姓名月份组成的一个簿重复的表
s1={'%d 月'%m for m in range(1,13)}#创建12个月份
s2=set(col1)#姓名去重
r=0
for m in s2:
    s3='/'.join(s1-{y for x,y in s if m==x})
    nws.write(r,0,m)
    nws.write(r,1,s3)
    r+=1
nwb.save('结果.xls')

案例二十:定义函数与使用1

知识点:函数定义与应用

improt xlrd
from xlutitls.copy import copy 
#--------------------
def age(id,dit):
    l = [id[x:y] for x,y in ((6,10),(10,12),(12,14))]
    date=dit.join(l)
    return date
#--------------------
wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
nwb=copy(wb)
nws=nwb.get_sheet('数据')
r=0
while r<ws.nrows-1:
    r+=1
    nws.write(r,2,age(ws.cell_value(r,1),'-'))

案例二十一:函数与定义与使用2

背景:定义等级判断函数,根据定义好的等级函数判断提供分数的等级

import xlrd 
from xlutils.copy import copy 

def level(num,l1,l2,l3,l4):
    if num>=l1:
        l="优"
    elif num>=l2:
        l='良'
    elif num>=l3:
        l='中'
    elif num>=l4:
        l='差'
    return l

wb=open_workbook('工作簿.xls')
ws=sheet_by_name('数据')
nwb=copy(wb)
nws=nwb.get_sheet('数据')
r=0
for c in ws.col_values(1)[1:]:
    r+=1
    nws.write(r,2,level(c,90,85,70,0))
nwb.save('结果.xls')

案例二十二:函数定义与使用3

需求:函数字符串提取函数,提取指定分隔符后的字符串

import xlrd 
from xlutils.copy import copy 

def Text_pos(str,delimiter,position=0):
    n,l=1,[-1]
    while n<=str.count(delimiter):
        l.append(str.index(delimiter,l[-1]+1))
        n+=1
    l=l[1:]
    if position ==0:
        l=l[0]
    elif position ==1:
        l=l[-1]
    elif positon ==2:
        l=l[:]
    return l

def mid(text,start,num):
    txt = text[start:start+num]
    return txt

wb=xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
nwb=copy(wb)
nws=nwb.get_sheet('数据')
n=0
for c in ws.col_values(1)[1:]:
    n+1
    l=[mid(','+c,x+1,6) for x in Text_pos(',',2)]
    nws.write(n,2,'\'.join(l))
nwb.save('结果.xls')

案例二十三:匿名函数使用

需求:根据身份证号判断性别

import xlrd 
from xlutils.copy import copy 
wb = xlrd.open_workbook('工作簿.xls')
ws=wb.sheet_by_name('数据')
nwb=copy(wb)
nws=nwb.get_sheet('数据')
n=0
for c in ws.col_value(1)[1:]:
    n+=1 
    nws.write(n,2,(lambda id:'男' if int(id[-2])%2==1 else '女')(c))
nwb.save('结果.xls')

案例二十四:每月大于等于100的记录

使用知识点:高阶函数map的使用,map()接受两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并将结果作为新的list返回。

如:map(len,['677','89','89']) 就是求列表['677','89','89']的长度

import xlrd,xlwt
wb=xlrd.open_workbook('工作簿.xls')
nwb=xlwt.Workbook(encoding='utf-8')#创建新工作簿
nws=nwb.add_sheet('结果')
def counter(list):
    return len([x for x in list if x>100])
n=0
for s in wb.sheets():
    n+=1
    nws.write(n,0,s.name)#s.name 工作表名称
    nws.write(n,1,list(map(counter,[s.col_values(1)[1:]]))[0])#s.col_values(1)每个工作表中第二列的数据  该map函数表示求第二列中大于100的数据个数
nws.write(0,0,'月份')
nws.write(0,1,'计数')
nwb.save('结果.xls')

  • 10
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

是鱼儿啊~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值