朋友说:能不能用python,帮我写一个“制作工资条”的自动化程序?

简介: 朋友说:能不能用python,帮我写一个“制作工资条”的自动化程序?

本文说明

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


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

image.png

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

image.png

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


代码逻辑剖析

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


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


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


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


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

image.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+1
            cell = ws.cell(row=r, column=c)
            cell.value = v
            cell.alignment = alignment
            cell.font = font
            cell.border = border
            cell.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 copy
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
wb = 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+1
            cell = ws.cell(row=r, column=c)
            cell.value = v
            cell.alignment = alignment
            cell.font = font
            cell.border = border
            cell.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')
相关文章
|
4天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
22 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
1天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
6 3
|
7天前
|
运维 监控 应用服务中间件
自动化运维:如何利用Python脚本提升工作效率
【10月更文挑战第30天】在快节奏的IT行业中,自动化运维已成为提升工作效率和减少人为错误的关键技术。本文将介绍如何使用Python编写简单的自动化脚本,以实现日常运维任务的自动化。通过实际案例,我们将展示如何用Python脚本简化服务器管理、批量配置更新以及监控系统性能等任务。文章不仅提供代码示例,还将深入探讨自动化运维背后的理念,帮助读者理解并应用这一技术来优化他们的工作流程。
|
8天前
|
数据管理 程序员 数据处理
利用Python自动化办公:从基础到实践####
本文深入探讨了如何运用Python脚本实现办公自动化,通过具体案例展示了从数据处理、文件管理到邮件发送等常见办公任务的自动化流程。旨在为非程序员提供一份简明扼要的实践指南,帮助他们理解并应用Python在提高工作效率方面的潜力。 ####
|
8天前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
8天前
|
数据采集 存储 XML
Python实现网络爬虫自动化:从基础到实践
本文将介绍如何使用Python编写网络爬虫,从最基础的请求与解析,到自动化爬取并处理复杂数据。我们将通过实例展示如何抓取网页内容、解析数据、处理图片文件等常用爬虫任务。
|
8天前
|
运维 监控 Linux
自动化运维:如何利用Python脚本优化日常任务##
【10月更文挑战第29天】在现代IT运维中,自动化已成为提升效率、减少人为错误的关键技术。本文将介绍如何通过Python脚本来简化和自动化日常的运维任务,从而让运维人员能够专注于更高层次的工作。从备份管理到系统监控,再到日志分析,我们将一步步展示如何编写实用的Python脚本来处理这些任务。 ##
|
10天前
|
机器学习/深度学习 算法 编译器
Python程序到计算图一键转化,详解清华开源深度学习编译器MagPy
【10月更文挑战第26天】MagPy是一款由清华大学研发的开源深度学习编译器,可将Python程序一键转化为计算图,简化模型构建和优化过程。它支持多种深度学习框架,具备自动化、灵活性、优化性能好和易于扩展等特点,适用于模型构建、迁移、部署及教学研究。尽管MagPy具有诸多优势,但在算子支持、优化策略等方面仍面临挑战。
28 3
|
12天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
15 3
|
14天前
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
17 1
下一篇
无影云桌面