看下图的考勤记录, 是不是有些眼晕,还不知怎么搞定它?




将一行数据转换成多行python python将多行转化为一行_将一行数据转换成多行python

原始考勤记录



今天就再说说对考勤记录的处理,有些考勤软件导出的考勤记录符合数据库的格式,每条记录是一行,处理起来很方便,但还有一些人脸识别考勤机,可能是比较便宜吧,只提供u盘导出数据的功能, 然后导出的数据每个员工是一行,并且还一个单元格中包含多条考勤记录,用换行符进行了分隔,如下图,对于这种表格的考勤记录那还能处理吗,当然是可以的,只要它的数据有规律,那就可以进行处理,不过很显然没法使用excel的函数公式来处理了,而是使用 python编程来对表格进行处理,最终还原成每行一条考勤记录的状态。

第一步:找数据规律

找好规律才能对数据进行处理,经过观察我们发现它有以下的规律

1、有一个标题行,里面存的是月份中的每一天,所以最多只有31列

2、工号和姓名单独保存在一行,工号在A列,姓名在I列

3、工号姓名的下一行是员工的考勤数据

4、一个单元格中的多条考勤记录是通过换行来分隔的

第二步:数据分解原理

1、先获取表格中的最大行和最大列,用来确定考勤记录的范围

2、使用双循环嵌套,按行进行数据的读取

3、对读取到的内容进行组合、拼接等

4、保存读取到的内容至一个新的表格中

第三步:使用python进行编程

需要引用openpyxl包,用它处理excel最是方便了

为了便于理解,直接设置好考勤记录文件的位置和名称,让python可以直接读取到文件,我们把它放在D盘根目录下面,读取表格的最大行和列。

print("#"*25 + "使用说明" +"#"*25)

print("# 原始考勤表格请放至D盘根目录下,更改名称为'刷卡记录.xlsx' ")

print("# 请按照提示输入四位数年份和两位数月份 ")

print("#"*60)

print("")

rows,cols=1,1

sheetName="刷卡记录"

tableName=r"D:刷卡记录.xlsx"

year=""

Y=input("请输入考勤的年份:")

M=input("请输入考勤的月份:")

wb=xl.load_workbook(tableName)

sheet=wb.get_sheet_by_name(sheetName)

rows=sheet.max_row

cols=sheet.max_column

print("考勤表格总共有行数%d,列数%d"%(rows,cols))

用代码创建一个新表,并初始化表头,只需要三列就行了,保存号码、姓名、日期

ws=wb.create_sheet("Sheet1")

sheetNew=wb.get_sheet_by_name("Sheet1")

sheetNew["A1"].value="号码"

sheetNew["B1"].value="姓名"

sheetNew["C1"].value="日期"

使循环来读取原始表格中的数据,在读取完成后保存成一个新表

hm="";xm="" #号码,姓名js_i,js_j=1,1 #新表记数for i in range(5,rows+1): xh="" print("正在转化第%d行数据..." %(i)) for j in range(1,cols+1): xh=sheet.cell(row=i,column=j).value if xh is None: continue if xh in "工 号: ": hm=sheet.cell(row=i,column=3).value xm=sheet.cell(row=i,column=11).value break else: year=str(Y)+"-"+str(M)+"-" + str(j) + " " xh_str=xh.split('') for x in xh_str: if x: js_i += 1 sheetNew.cell(row=js_i, column=1).value = hm sheetNew.cell(row=js_i, column=2).value = xm sheetNew.cell(row=js_i, column=3).value = year + x + ":00"try: wb.save(tableName) print("保存完成,请打开查看...")except: print("保存文件时出错...")




将一行数据转换成多行python python将多行转化为一行_将一行数据转换成多行python_02


好了,到此就把一个复杂的表格转换完成了,新的表格将会是一个标准的考勤记录表,然后就可以放在专门编写的考勤软件中进行查看了。

来运行一下软件看看最终的结果,执行完成后打开D盘根目录下的“刷卡记录.xlsx”文件会发现里面多了一个sheet1,就是转换完成后的数据。


将一行数据转换成多行python python将多行转化为一行_python_03


将一行数据转换成多行python python将多行转化为一行_python_04


总结:对于一些复杂格式的数据Excel无能为力处理时,就需要借助一些简单的编程工具来处理了,可以实现数据的快速处理