Python实现Excel行列转换

server/2025/1/8 7:37:12/

这两天公司在进行人事系统切换,HR小同事焦头烂额的跑过来问我,有没有办法弄excel行列转换呀?我想了想:“用Excel的行列转换不就可以了吗?”啪啦啪啦的说了一堆,然后打开Excel给她演示。小同事不屑一顾:“这么简单还要问你呀!你看看我这个数据源,是所有员工的考勤数据,旧系统是行显示,新系统导入要按照列统计。要按照人员进行排列,还有缺勤的要留空…”.一下子把我弄懵了,一下子还没想出简单快捷的办法。小同事又接着说,我现在手工一个个的弄,还不知道弄到什么时候呢。要不贴错了就苦逼了。看来,遇到棘手的还是想到了IT,我拍拍胸膛,这事包我身上。小同事一脸疑惑:”行吗”?”当然”。看来要再次搬出Python的看家伎俩了。没办法,谁让Python处理数据那是天生的?

原数据格式:

目标数据格式:

根据HR同事的要求,对需求进行了分析并归纳如下步骤:

  1. 读取数据源,将数据装入list中
  2. 从list中提取人员名单,去重
  3. 根据人员名单,筛选考勤记录,装入临时list中,进行日期处理,并返回到最终list, 删除临时表。
  4. 最终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')


http://www.ppmy.cn/server/155721.html

相关文章

自从学会Git,感觉打开了一扇新大门

“同事让我用 Git 提交代码,我居然直接把项目文件压缩发过去了……”相信很多初学者都经历过类似的窘境。而当你真正掌握 Git 时,才会发现它就像一本魔法书,轻松解决代码管理的种种难题。 为什么 Git 能成为程序员的标配工具?它究…

微信小程序中使用 TDesign 组件库

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的全栈工程师 欢迎分享 / 收藏 / 赞 / 在看…

《一文读懂PyTorch核心模块:开启深度学习之旅》

《一文读懂PyTorch核心模块:开启深度学习之旅》 一、PyTorch 入门:深度学习的得力助手二、核心模块概览:构建深度学习大厦的基石三、torch:基础功能担当(一)张量操作:多维数组的神奇变换(二)自动微分:梯度求解的幕后英雄(三)设备管理:CPU 与 GPU 的高效调度四、to…

鸿蒙 NEXT 开发中,使用公共事件进行进程间通信

大家好,我是 V 哥,在鸿蒙 NEXT 开发中,使用公共事件进行进程间通信(IPC)是一种常见的做法。下面我将提供一个完整的业务代码示例,并解释逻辑关系,以便即使是初学者也能按照步骤进行实操&#xf…

nginx 基于 geoip 模块限制地区访问

1、安装 geoip 库 [rootVM-0-15-centos ~]# yum -y install geoip geoip-devel 2、下载并安装 MaxMind 的免费 GeoIP 数据库。这里我选择下载 GeoLite2 数据库,适用于大多数应用。 访问 maxmind 官网(https://www.maxmind.com/)&#xff0c…

【机器学习】由浅入深学习网格搜索

一、网格搜索的概念和意义 在机器学习的广阔领域中,模型的性能往往取决于超参数的合理设置。超参数是在模型训练前需要手动设定的参数,如决策树的最大深度、随机森林的树的数量、支持向量机的惩罚参数等,它们不像模型内部的权重参数那样可以通…

简单使用linux

1.1 Linux的组成 Linux 内核:内核是系统的核心,是运行程序和管理 像磁盘和打印机等硬件设备的核心程序。 文件系统 : 文件存放在磁盘等存储设备上的组织方法。 Linux 能支持多种目前浒的文件系统,如 ext4 、 FAT 、 VFAT 、 ISO9660 、 NF…

No.3十六届蓝桥杯备战|数据类型长度|sizeof|typedef|练习(C++)

数据类型⻓度 每⼀种数据类型都有⾃⼰的⻓度,使⽤不同的数据类型,能够创建出⻓度不同的变量,变量⻓度的不同,存储的数据范围就有所差异。 sizeof操作符 sizeof 是⼀个关键字,也是操作符,专⻔是⽤来计算特…