有一台得力的指纹刷卡机,导出的excel表格文件里的"刷卡记录"表中只有具体的刷卡时间记录,没有每人每月的刷卡总数统计,需要人工进行二次统计。
为此,我编写了一个python程序,可以将多个导出的表进行汇总,生成新的总表。代码如下:
import xlrd
import xlwt
from xlrd import open_workbook
import os,time
"""
统计某一行的消费记录总数
"""
def totalXfs(tb,theRow):
n = 0
for i in range(tb.ncols):
cvStr=tb.cell(theRow,i).value
if ('07:'in cvStr) or ('08:'in cvStr):
n+=1
if ('11:' in cvStr) or ('12:' in cvStr):
n+=1
# print (n)
return n
allFileList=os.listdir('.\\')
fileList=[]
for i in allFileList:
if i[-7:]=='汇总表.xls':
fileList.append(i)
print(fileList)
wb2 = xlwt.Workbook(encoding='gbk')
tb2 = wb2.add_sheet('总表', cell_overwrite_ok=True)
tb2.write(1,1,'姓名')
col=1
for m in range(len(fileList)):
wb=open_workbook(fileList[m])
print ('正在处理:',fileList[m])
tb2.write(1, col+1, fileList[m][:2]+'月份')
tb=wb.sheet_by_name("刷卡记录")
# print(tb.nrows,tb.ncols)
for j in range(4,tb.nrows,2):
if m==0:
tb2.write(j//2,col,tb.cell(j,10).value)
tb2.write(j//2,col+1,totalXfs(tb,j+1))
col+=1
timeStr = time.strftime("%Y%m%d", time.localtime())
wb2.save('总表'+timeStr+'.xls')
print ('\n统计完毕。')
# END
在执行过程中大部分月份都很正常,但却有一个月份出现了错误,错误如下:
报self._cell_types[rowx][colx],IndexError: list index out of range错误,应该的遍历出问题了。搜索了网上的介绍,基本上都是说表格为空的原因。但是这个表格并不为空呀。琢磨了半天,发现这个表的最后一行(第288行)确实没有数据。会不会是因为这个原因呢?我想用tb.nrows读出的行数是288行,说明这288行是可以读取的。我尝试着读取288行的1~31列的单元格数据,结果就报相同错误。由此确定,这一行全部为空的话,是不能进行遍历的。于是修改了代码,不读取最后一行和上一行,问题解决。
修改的部分代码如下:
try:
for j in range(4,tb.nrows,2):
if m==0:
tb2.write(j//2,col,tb.cell(j,10).value)
tb2.write(j//2,col+1,totalXfs(tb,j+1))
col+=1
except: #处理最后一行无消费记录的情形
for j in range(4, tb.nrows-2, 2):
if m == 0:
tb2.write(j // 2, col, tb.cell(j, 10).value)
tb2.write(j // 2, col + 1, totalXfs(tb, j + 1))
tb2.write(tb.nrows // 2, col + 1, 0)
col += 1