Python实现Excel行列转换
这两天公司在进行人事系统切换,HR小同事焦头烂额的跑过来问我,有没有办法弄excel行列转换呀?我想了想:“用Excel的行列转换不就可以了吗?”啪啦啪啦的说了一堆,然后打开Excel给她演示。小同事不屑一顾:“这么简单还要问你呀!你看看我这个数据源,是所有员工的考勤数据,旧系统是行显示,新系统导入要按照列统计。要按照人员进行排列,还有缺勤的要留空…”.一下子把我弄懵了,一下子还没想出简单快捷的办法。小同事又接着说,我现在手工一个个的弄,还不知道弄到什么时候呢。要不贴错了就苦逼了。看来,遇到棘手的还是想到了IT,我拍拍胸膛,这事包我身上。小同事一脸疑惑:”行吗”?”当然”。看来要再次搬出Python的看家伎俩了。没办法,谁让Python处理数据那是天生的?
原数据格式:
目标数据格式:
根据HR同事的要求,对需求进行了分析并归纳如下步骤:
- 读取数据源,将数据装入list中
- 从list中提取人员名单,去重
- 根据人员名单,筛选考勤记录,装入临时list中,进行日期处理,并返回到最终list, 删除临时表。
- 最终list写入原excel,完成。
参考代码如下:
from openpyxl import load_workbook
fname="source.xlsx"
def remove_duplicates(lst):#去重
return [x for i, x in enumerate(lst) if i == lst.index(x)]
def two_to_one(lst):
a=[]
for line in lst:
for perline in line:
a.append(perline)
return a
per_line=[]
total_line=[]
per_name_list=[]
name_list=[]
wb=load_workbook(fname,data_only=True) #读取数据源
ws=wb["Sheet4"]
for row in ws.iter_rows():
i=0
for cell in row:
if i==1 or i==2 or i==3:
per_line.append(cell.value)
if i==1:
per_name_list.append(cell.value)
i+=1
total_line.append(per_line)
name_list.append(per_name_list)
per_line=[]
per_name_list=[]
name_list2=remove_duplicates(name_list[1:])
print(name_list2) #打印去重后的名单
e_per_line=[]
e_line=[]
new_line=[]
new_line2=[]
all_list=[]
for line in name_list2:
#print(line)显示人名
for perline in total_line:
if line[0]==perline[0]:
e_per_line.append(perline[1])
e_per_line.append(perline[2])
if len(e_per_line)!=0:
e_line.append(e_per_line)
e_per_line=[]
#print(e_line)
new_line=two_to_one(e_line)
new_line2=line+new_line
#print(new_line2)
all_list.append(new_line2)
print("------------------")
e_line=[]
wb2=load_workbook('source.xlsx')#回写处理后的数据
ws2=wb2["Sheet31"]
for line in all_list:
ws2.append(line)
wb2.save('source.xlsx')