目录
案例2:将指定工作簿指定工作表下语文、数学两列成绩同时大于等于80的记录写入新工作簿
案例4:统计出开始达标的月份以及业绩,其中每个人累计业绩大于等于1000则表示达标
案例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')