打印工资条怎么做到每个人都有表头明细_朋友说:能不能用python,帮我写一个“制作工资条”的自动化程序?...

本文说明

今天和一个朋友吃饭,她说我经常使用Excel制作工资条,但是每个月都要做一遍,你能不能用python写一个代码,能够自动化完成这个工作。这当然可以啦,就是这么牛逼!

e5936adfa23d8db2eda6166b189e66c7.png

我们先来看看原始数据是什么样子的。

5c052d8da7fb7163aa2beb0fd89f901a.png

那么最后做成的效果是什么样子的呢?

db903cac939ff3861bf3db7de3ed04b3.png

这就很方便了,不管你公司有多少人,只要你把原始数据丢给我,我都可以秒出一个工资条,省得每次都需要使用Excel操作一遍,并且数据多了Excel还会卡顿。

代码逻辑剖析

那么这样一个程序,是怎么写的呢?

其实只要是逻辑想清楚了,剩下的就是写代码的事儿了。下面我就带着大家梳理一下,这段代码的逻辑。

首先,我们应该是读取Excel表格。然后需要拷贝其中一个sheet表到另外一张sheet表,并给sheet命名。这样做的目的:为了存放制作好工资条的那张sheet表。

import re
import openpyxl
from copy import copywb = openpyxl.load_workbook('工资条.xlsx')
# copy_worksheet():拷贝sheet表 
wb.copy_worksheet(wb['工资条'])
# worksheets:以列表的形式返回所有的Worksheet(表格)
ws = wb.worksheets[-1]
ws.title = 'final_工资条'

可能这样说的话,大家还是不知道上述代码每一行,到底是什么意思,我下面截一张图给大家,其实就可以很好的说明上述函数的含义了。

f4db21a1270e03e02f7ea6c5031c88b6.png

接着,就是给每一行数据前面添加一个表头。由于后面每一行表头的样式,都与第一行完全一模一样的,因此我们需要复制第一行表头中的样式。

def cell_style(cell):alignment = copy(cell.alignment)    # 对齐样式border = copy(cell.border)          # 边框样式fill = copy(cell.fill)              # 填充样式font = copy(cell.font)              # 字体样式return alignment, border, fill, font# 获取标题行中,每个单元格中的各种样式
alignment, border, fill, font = cell_style(cell=cells_rows[0][0])

从上面的代码中可以看到:我定义了一个函数,我们直接使用copy库中的copy()方法,直接拷贝单元格的4大样式。因为原表第一行中每个单元格的4大样式,都是完全一致的,因此我们直接获取第一个单元格的样式即可。

最后这一part是整个代码中最精彩的部分,不太好叙述,大家仔细研究一下下方的注释。

for i, _ in enumerate(cells_rows[1:]):if i > 0:index = i*3# 每循环一次,就在对应位置下方插入2行。1行是空行,1行是表头行。ws.insert_rows(idx=index, amount=2)# 因为每次插入2行,所以需要在表头行那里,将表头及其样式写入。for j, v in enumerate(header):r, c = index+1, j+1cell = ws.cell(row=r, column=c)cell.value = vcell.alignment = alignmentcell.font = fontcell.border = bordercell.fill = fill# 更新后面的公式if cell.coordinate[:1] in ('H', 'J'):cell = ws.cell(row=r+1, column=c)cell.value = re.sub('d+', str(r+1), cell.value)

这里需要特别说明一点的就是更新公式。就拿第一次循环来说,我们在第3行的位置,插入了2个空白行。那么原本第3行的数据,此时就被挤到了第5行。

但是需要注意的是,它是被迫挤到第5行的,所以这一整行是原封不动搬到第5行的,包括它原来的公式。原来在第3行的时候,如果公式是SUM(E3:G3),被挤到到了第5行后,应该是SUM(E5:G5),但是它仍然是SUM(E3:G3),所以需要我们修改,上述代码中正是使用正则将这个数字3改为了5。

完整代码

import re
import openpyxl
from copy import copydef cell_style(cell):alignment = copy(cell.alignment)    # 对齐样式border = copy(cell.border)          # 边框样式fill = copy(cell.fill)              # 填充样式font = copy(cell.font)              # 字体样式return alignment, border, fill, fontwb = openpyxl.load_workbook('工资条.xlsx') 
wb.copy_worksheet(wb['工资条'])
ws = wb.worksheets[-1]
ws.title = 'final_工资条'# 获取每一列的值,拼接在一个列表中
cells_rows = [[cell for cell in row] for row in ws.rows]# 获取标题
header = [cell.value for cell in cells_rows[0]]# 获取标题行中,每个单元格中的各种样式
alignment, border, fill, font = cell_style(cell=cells_rows[0][0])for i, _ in enumerate(cells_rows[1:]):if i > 0:index = i*3# 每读取一行,就在下方插入两行ws.insert_rows(idx=index, amount=2)# 写表头for j, v in enumerate(header):r, c = index+1, j+1cell = ws.cell(row=r, column=c)cell.value = vcell.alignment = alignmentcell.font = fontcell.border = bordercell.fill = fill# 更新后面的公式if cell.coordinate[:1] in ('H', 'J'):cell = ws.cell(row=r+1, column=c)cell.value = re.sub('d+', str(r+1), cell.value)
# 整个代码写完后,一定要记得保存               
wb.save('工资条.xlsx')    

b6dc654989a5ca17a9c2fb4788bd9f0f.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/537288.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做优化的数据库工程师请参考!CynosDB的计算层设计优化揭秘

本文由云社区发表本文作者:孙旭,腾讯数据库开发工程师,9年数据库内核开发经验;熟悉数据库查询处理,并发控制,日志以及存储系统;熟悉PostgreSQL(Greenplum,PGXC等&#xf…

netty发送数据_看完这篇还不清楚Netty的内存管理,那我就哭了

说明在学习Netty的时候,ByteBuf随处可见,但是如何高效分配ByteBuf还是很复杂的,Netty的池化内存分配这块还是比较难的,很多人学习过,看过但是还是云里雾里的,本篇文章就是主要来讲解:Netty分配池…

数字化改革体系架构“152”两次迭代升级为“1612”

数字化改革体系架构已经完成两次迭代,152-1512-1612。 2021年,浙江在全国率先启动一项关系全局、影响深远、制胜未来的重大集成改革——数字化改革,并确定为全面深化改革的总抓手。 2021年2月18日,数字化改革大会“152”工作体系…

python 40位的数减个位数_Python数据分析入门教程(五):数据运算

作者 | CDA数据分析师进行到这一步就可以算是开始正式的烹饪了,在这部分之前的数据操作部分我们列举了一些不同维度的分析指标,这一章我们主要看看这些指标都是怎么计算出来的。一、算术运算算术运算就是基本的加减乘除,在Excel或者Python中数…

数字化改革“152”体系详解

架构图 “1” 即一体化智能化公共数据平台(平台大脑),按照“统一规划、统一支撑、统一架构、统一平台、统一标准、统一建设、统一管理、统一运维"的要求,建设省市县三级公共数据平台,叠加三级“大脑功能&#xf…

数字化改革“141”体系

县级以上是“152”大框架,县以下是“141”体系。 141体系是:县级社会治理中心、乡镇(街道)基层治理“四个平台”、村社网格。 “1” 第一个“1”指县级社会治理中心。 “4” 第二个“4”指乡镇(街道)基…

接口做的好怎么形容_淘宝直播预告怎么做才合格?如何做好?

很多淘宝商家在直播前没有做淘宝直播预告,或者不知道怎么去做直播预告,这对直播的效果会有很大的影响,那么直播前如何做好直播预告呢?怎样的直播预告才是合格的,下面来了解一下。1.必须去淘宝直播中控台发布。因为手机上发布目前…

“1+7+N”改革工作体系介绍

2021年,浙江省确定了“17N”的改革工作体系,要求以全面深化改革新成效再创体制机制新优势。(2022年已经升级为“1612N”,点击阅读) “1” 数字化改革,这是浙江全面深化改革的总抓手。将聚焦打造全球数字变…

浙江省数字化改革回顾(2022年5月)

事业的伟大在于目标的壮丽,也在于过程的壮丽;改革的成果在于享有的丰富,也在于经历的丰富。2021年2月18日,春节假期后首个工作日,浙江省委召开全省数字化改革大会,在全国率先开启数字化改革探索实践。此后&…

python 某个数是不是在某个范围内_教写一个简单的python小程序(04)

点击蓝字关注我们 会酸的柚子Python爱好者搞机少年七夕结束了~酸柚也是被强塞了满嘴的狗粮在这样充满恋爱腐朽气息的一天酸柚也是马不停蹄的在赶稿子兄弟们,给我顶起来呀~我们来看看今日的题目可能很多小伙伴对完全平方数这个概念有点生疏了完全平方数数学上&#x…

浙江公布2022年数字化改革“最系列“成果 评选出最佳应用104项

10月29日,省委改革办(省数改办)公布了2022年数字化改革“最系列”成果。该评选由省委改革办(省数改办)会同省委政研室、省人大常委会法工委、省市场监管局和省大数据局共同开展,评选了最佳应用104项、最强大…

dot net core 使用 IPC 进程通信

原文:dot net core 使用 IPC 进程通信版权声明:博客已迁移到 http://lindexi.gitee.io 欢迎访问。如果当前博客图片看不到,请到 http://lindexi.gitee.io 访问博客。本文地址 https://blog.csdn.net/lindexi_gd/article/details/79946496 dot net core 使…

Android手机用wifi连接adb调试的方法

https://www.jianshu.com/p/dc6898380e38 0x0 前言 Android开发肯定要连接pc的adb进行调试,传统的方法是用usb与pc进行连接,操作简单即插即用,缺点是pc上必须得有对应手机的usb驱动程序,对于谷歌亲儿子系列和三星摩托等外国品牌而…

控制台应用程序换换为窗体应用_Epic为开发者设计了一套iPhone使用的运动捕捉应用程序...

玩懂手机网7月13日资讯,我们都知道对于游戏或者是动漫开发者来说,运动捕捉设备是一套非常昂贵的设备,需要非常专业的独立开发人员,大量的时间才能完成,最近Epic为开发者设计了一套iPhone使用的运动捕捉应用程序。这套i…

蚂蚁金服亿级并发下的移动端到端网络接入架构解析

为了与金融从业者、科技从业者共同探讨金融 业务的深层次问题,蚂蚁金服联手 TGO 鲲鹏会上海分会,在 12 月 8 日举办了「走进蚂蚁金服:双十一背后的蚂蚁金服技术支持」活动。蚂蚁金服高级技术专家贾岛为大家分享了《亿级并发下的蚂蚁移动端到…

如何根据视频的宽屏与竖屏来排序?

原理 宽屏与竖屏是根据 帧高度 与 帧宽度 来区分的 帧高度就是图片高度(纵向的像素尺寸),帧宽度就是图片宽度(横向的像素尺寸),分辨率就是(高度x宽度)。 windows11的文件排序&…

sap模块介绍_小迈说|SAP究竟有多少模块?

SAP究竟有哪些模块继上一期小迈说SAP!SPA?的区别,相信大部分读者明白了我们与水浴按摩行业的分别,可是仅仅区分名字还不够,SAP还有众多的模块,这些又该怎么去了解呢?这就轮到肩负爱与责任的小迈…

360 再次开源管理平台 Wayne:基于企业级 Kubernetes 集群

2019独角兽企业重金招聘Python工程师标准>>> 奇虎 360 宣布正式开源 Wayne ,这是一个由 360 搜索云平台团队开发的通用的、基于 Web 的 Kubernetes 多集群一站式可视化管理平台。内置了丰富多样的功能,满足企业的通用需求,同时插件…

Node.js 根本没有这样搞性能优化的?

1、使用最新版本的 Node.js 仅仅是简单的升级 Node.js 版本就可以轻松地获得性能提升,因为几乎任何新版本的 Node.js 都会比老版本性能更好,为什么? Node.js 每个版本的性能提升主要来自于两个方面: V8 的版本更新;Nod…