本文说明

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

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

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

这就很方便了,不管你公司有多少人,只要你把原始数据丢给我,我都可以秒出一个工资条,省得每次都需要使用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_工资条'

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

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

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')    

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

  1. 打印工资条怎么做到每个人都有表头明细_一分钟生成500人的工资条?还有2种方法?...

    很多HR或财务小伙伴拿到工资表后,都要制作给员工制作工资条,工资条记录着每个员工的月收入分项和收入总额,是我们必须掌握的技能,工资条制作的方法非常多,这篇文章就分享给你两个简单.好用的工资条制作方法. ...

  2. 打印工资条怎么做到每个人都有表头明细_抖音百万点赞!2018年最火的5个Excel骚操作,你都会吗?...

    本文作者丨可可&小植 本文由「秋叶 PPT」原创发布 如需转载,请在公众号发送关键词「转载」查看说明 要说 2018 年掀起全民狂欢的手机应用 毋庸置疑肯定是抖音短视频 App 一打开 App ...

  3. 打印工资条怎么做到每个人都有表头明细_现在还在用订书钉装订工资条,算是一种落后吗?你的公司怎么发?...

    工资条经历过三个时代,有的公司到现在还在用订书钉装订工资条,你的公司怎么发? 做企业薪酬的HR应该都知道,根据我国<工资支付暂行规定>第六条第三款规定,"用人单位必须书面记录支付 ...

  4. python自动卸载win程序_朋友说:能不能用python,帮我写一个“制作工资条”的自动化程序...

    本文说明 今天和一个朋友吃饭,她说我经常使用Excel制作工资条,但是每个月都要做一遍,你能不能用python写一个代码,能够自动化完成这个工作.这当然可以啦,就是这么牛逼! 我们先来看看原始数据是什 ...

  5. excel如何删除空白行_WPS表格技巧—长表格打印时如何让每页都有表头

    我们在利用WPS表格和Excel表格进行办公的时候,经常会遇到长表格,打印时需要好几页纸,但是表头却只在第一页才有,导致我们在看数据时很不方便.那么对于长表格,我们要进行怎样的设置才能使打印的每一页都 ...

  6. 我用python,帮朋友写了一个“制作工资条”的自动化程序!

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 白头宫女在,闲坐说玄宗. 本文说明 ...

  7. python读取mysql数据每次都耗时600秒_就是这么流弊!三行Python代码,让数据处理速度提高2到6倍...

    幸运的是,Python 库中内建了一些隐藏的特性,可以让我们充分利用所有 CPU 核心的能力.通过使用 Python 的 concurrent.futures 模块,我们只需要 3 行代码就可以让一个 ...

  8. 戏人看戏--什么是Web3.0?区块链又是什么?如何写一个web3.0的界面?

    杂谈 有人反馈说大数据现在太可怕了,上午搜的下午在空间的广告里就看到了-- 那么有什么办法可以彻底解决这个问题?Web3.0! 前段时间被炒的沸沸扬扬的比特币也是区块链的产物 正文部分:什么是Web3 ...

  9. jqprint 分页打印_jquery jqprint 打印 每页控制打印内容,每一页都带有表头,怎么搞啊...

    展开全部 jqprint是一个基于jQuery编写的页面打印的一个小插件62616964757a686964616fe4b893e5b19e31333361323037,但是不得不承认这个插件确实很厉 ...

最新文章

  1. Validate + Boostrap tooltip 表单验证示例
  2. Java数据解析---PULL
  3. 伪静态php配置,PHP开启伪静态配置
  4. android自定义控件是一个 内部类 如何在xml中引用,android 自定义view属性
  5. vue移动端项目缓存问题实践
  6. Linux升级内核的正确姿势
  7. 数据结构思维 第十二章 `TreeMap`
  8. Python IDLE 基本操作
  9. jbod ugood 磁盘驱动状态_LSI Storcli 工具使用
  10. LINUX下设置定时运行PERL脚本
  11. 昆仑通态复制的程序可以用吗_昆仑通态专题(九):MCGS组态软件的实时数据库...
  12. 电商后台权限设置有哪些规范你知道吗?
  13. 如何查看微信小程序服务器域名并且修改
  14. Unity-lambda表达式
  15. 【Cocos2d-x游戏引擎开发笔记(25)】XML解析
  16. Scala中的面向对象
  17. 耦合是什么?如何做到解耦?
  18. PT项目-SAP库存账龄分析报表
  19. EBCDIC、ASCII与EBCDIC的关系及相互转化
  20. PS系列之 -- 通道抠图进阶 : 用通道抠取头发

热门文章

  1. python做excel表格教程视频_基于Python实现excel表格读写
  2. 卡法电子商务 java_javacard DES算法API使用示例
  3. java el ognl_EL和OGNL表达式的区分
  4. adb 更新 android sdk,[转载]安装Android时SDK AVD MANAGER时更新报错的解决办法
  5. php mysql 图像_将图像插入MySQL并使用PHP检索图像
  6. java中匿名类的注意细节
  7. hadooppythonsql_python - hadoop,mapreduce demo
  8. 下列关于html5表单的多样输入方式,IT兄弟连 HTML5教程 HTML5表单 多样的输入类型1...
  9. mysql 执行计划详解,Mysql中的explain执行计划详解(1)
  10. assertpythonraise_使用assertRaise测试异常消息