成都CDA数据分析师|我用python,帮朋友写了一个“制作工资条”的自动化程序!本文说明代码逻辑剖析完整代码


北京联盟_本文原题:我用python , 帮朋友写了一个“制作工资条”的自动化程序!
本文说明
周末和一个朋友吃饭 , 她说我经常使用Excel制作工资条 , 但是每个月都要做一遍 。 你能不能用python写一个代码 , 能够自动化完成这个工作 , 这当然可以啦 , 就是这么牛逼!
成都CDA数据分析师|我用python,帮朋友写了一个“制作工资条”的自动化程序!本文说明代码逻辑剖析完整代码
本文插图

【成都CDA数据分析师|我用python,帮朋友写了一个“制作工资条”的自动化程序!本文说明代码逻辑剖析完整代码】我们先来看看原始数据是什么样子的 。
成都CDA数据分析师|我用python,帮朋友写了一个“制作工资条”的自动化程序!本文说明代码逻辑剖析完整代码
本文插图

那么最后做成的效果是什么样子的呢?
成都CDA数据分析师|我用python,帮朋友写了一个“制作工资条”的自动化程序!本文说明代码逻辑剖析完整代码
本文插图

这就很方便了 , 不管你公司有多少人 , 只要你把原始数据丢给我 , 我都可以秒出一个工资条 , 省得每次都需要使用Excel操作一遍 , 并且数据多了Excel还会卡顿 。
代码逻辑剖析 那么这样一个程序 , 是怎么写的呢?
其实只要是逻辑想清楚了 , 剩下的就是写代码的事儿了 。 下面我就带着大家梳理一下 , 这段代码的逻辑 。
首先 , 我们应该是读取Excel表格 。 然后需要拷贝其中一个sheet表到另外一张sheet表 , 并给sheet命名 。 这样做的目的:为了存放制作好工资条的那张sheet表 。
import reimport openpyxlfrom copy import copywb = openpyxl.load_workbook('工资条.xlsx')# copy_worksheet():拷贝sheet表wb.copy_worksheet(wb['工资条'])# worksheets:以列表的形式返回所有的Worksheet(表格)ws = wb.worksheets[-1]ws.title = 'final_工资条'可能这样说 , 大家还是不知道上述代码到底是什么意思?我下面截一张图给大家 , 其实就可以很好的说明上述函数的含义了 。
成都CDA数据分析师|我用python,帮朋友写了一个“制作工资条”的自动化程序!本文说明代码逻辑剖析完整代码
本文插图

接着 , 就需要给每一行数据前面添加一个表头 。 由于后面每一行表头的样式 , 都与第一行完全一模一样的 , 因此我们需要复制第一行表头中的样式 。
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 = http://news.hoteastday.com/a/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 = http://news.hoteastday.com/a/re.sub('\d+', str(r+1), cell.value)这里需要特别说明一点的就是更新公式 。 就拿第一次循环来说 , 我们在第3行的位置 , 插入了2个空白行 。 那么原本第3行的数据 , 此时就被挤到了第5行 。


推荐阅读