关于python:Python自动化结算工资和统计报表

59次阅读

共计 5786 个字符,预计需要花费 15 分钟才能阅读完成。

实例需要阐明

你好,我是悦创。

博客首发:https://bornforthis.cn/column/pyauto/auto_base07.html

学习了 Excel 文件的写入、读取和追加内容,那当初来做个案例。

需要形容并整顿,如下:

  • 每个月的 2 号,你会收到一个 Excel 文件;
  • 文件中蕴含了 各个部门的员工信息;
  • 你须要一天之内实现这些报表的整顿和统计,而后交给领导检查和发放工资;
  • 工夫要快,工资发晚了,共事会埋怨你;
  • 工作量还是比拟大的,你须要解放双手,让程序去解决问题
  • 让程序疾速的计算出每个人的工资,并将统计信息联合模板,生成“xxxx 年 xx 月各部门员工数据总览 ”;
  • 薪资计算规定:早退一次扣 20,一个月最多扣 200;

简略的财务自动化结算需要,并且给出了各部门的工资表格文件和统计报表的模板文件。

需要阐明图示

简略的财务自动化结算需要,并且给出了各部门的工资表格文件和统计报表的模板文件,截图如下:

批量生成财务报表.ipynb”这个文件外面有可执行代码,执行后会主动的生成 5 个部门的财务文件。你也能够本人应用上面代码主动生成:

# -*- coding: utf-8 -*-
# @Time    : 2022/7/15 21:48
# @Author  : AI 悦创
# @FileName: demo2.py
# @Software: PyCharm
# @Blog:http://www.aiyc.top
# @公众号:AI 悦创
import xlwt
import faker
import random
import datetime


def create_excel_file(filename, department):
    wb = xlwt.Workbook(filename)
    sheet = wb.add_sheet('sheet1')
    fake = faker.Faker("zh_CN")
    head_data = ['部门', '姓名', '工号', '薪资(元)', '早退次数(次)', '奖金(元)', '实发工资']
    for head in head_data:
        sheet.write(0, head_data.index(head), head)
    for i in range(1, random.randint(5, 100)):
        sheet.write(i, 0, department)
        sheet.write(i, 1, fake.last_name() + fake.first_name())
        sheet.write(i, 2, "G{}".format(random.randint(1, 1000)))
        sheet.write(i, 3, random.randint(4000, 16000))
        sheet.write(i, 4, random.choice([0, 0, 0, 1, 2, 3, 4]))
        sheet.write(i, 5, random.choice([200, 300, 400, 500, 600, 700, 800, 900]))
    wb.save(filename)


department_name = ['技术部', '推广部', '客服部', '行政部', '财务部']
for dep in department_name:
    xls_name = "{}-{}.xls".format(datetime.datetime.now().strftime("%Y-%m"), dep)
    create_excel_file(xls_name, dep)
    print(xls_name, "新建实现")

上面是财务文件和模板文件的截图:

财务文件中,每个用户数据,都是短少应发工资的,须要用程序计算和填写;

模板文件的应用,须要将本月的部门财务文件全副计算并统计进去,而后填充到模板文件中,生成一个本月的数据总览表格,如下截图:

选中的局部是须要应用程序主动填写。

一共有 5 个财务文件,每个文件有不固定个数的员工信息。

那接下来就开始写代码,实现自动化工资结算和统计报表的工作。

库的导入和筹备代码

首先第一步,导入须要的库,生成工夫对象。还有就是文件夹中,放着很多文件,有 xlsipynb 等格局,所以还需指定要操作的文件名,如下代码:

import datetime
import xlrd, xlwt
from xlutils.copy import copy

department = ['技术部', '推广部', '客服部', '行政部', '财务部']
template_name = "月结统计模板.xls"
today_datetime = datetime.datetime.now()
need_process_xls = []
for dep in department:
    xls_name = "{}-{}.xls".format(datetime.datetime.now().strftime("%Y-%m"), dep)
    need_process_xls.append(xls_name)
print(need_process_xls)
# 输入:['2022-12- 技术部.xls', '2022-12- 推广部.xls', '2022-12- 客服部.xls', '2022-12- 行政部.xls', '2022-12- 财务部.xls']

这里指定了模板文件名,工夫对象,而后批量的生成了所需解决的部门财务文件。

Python 自动化结算工资

每个财务文件都是完全一致的,就是数据的不同,所以接下来,做一个函数,所做的操作就是接管文件名,并计算出文件中全副人员的工资,并写入文件而后保留。代码如下:

def process_xls_return_data(xls_name):
    wb = xlrd.open_workbook(xls_name)
    wb_sheet = wb.sheet_by_index(0)
    xwb = copy(wb)
    xwb_sheet = xwb.get_sheet('sheet1')
    rows = wb_sheet.nrows
    for row in range(1, rows):
        bm = wb_sheet.cell(row, 0).value
        xm = wb_sheet.cell(row, 1).value
        gh = wb_sheet.cell(row, 2).value
        gz = wb_sheet.cell(row, 3).value
        cdcs = wb_sheet.cell(row, 4).value
        jj = wb_sheet.cell(row, 5).value
        sfgz = gz - (cdcs * 20) + jj  # 实发工资 = 工资  -(早退次数 *20)+  奖金
        print(bm, xm, gh, gz, cdcs, jj, sfgz)
        xwb_sheet.write(row, 6, sfgz)
        xwb.save(xls_name)


for cls in need_process_xls:
    process_xls_return_data(cls)

对函数代码进行介绍:

  • 关上文件,关上 sheet,复制文件,读取文件中数据的总行数;
  • 从第二行【索引 1】开始,读取 部门、姓名、工号、工资、早退次数、奖金;
  • 而后计算应发工资,公式:应该工资 = 工资 –(早退次数 *20)+ 奖金;
  • 将应该工资写入到以后行的第 7 个地位【索引 6】上;
  • 最初保留,保留的文件名仍旧是源文件名;
  • 实现单个文件的操作;

最上面的 for 循环,就是循环读取要操作的全副财务文件,一一进入函数中操作,计算工资和保留。

Python 自动化结算工资 + 报表统计

自动化的工资结算曾经解决好了,上面就是统计各个部门的财务报表。

报表中,须要写入 部门、总人数、早退人数、拿奖金人数、应发总工资这五项,还有头部的“xxxx-xx- 各部门员工数据总览

部门的数据,都是从单个的部门财务文件中获取,例如早退人数和拿奖金人数,都是判断是否早退和是否有奖金,都用一个参数进行记录。

这个需要,能够在原来的函数之上,做个统计操作,并在函数结尾时,将这五个数据,做成列表并返回回去。

最初一个就是统计报表的头部字段,外面含有年份和月份,这个能够间接应用工夫对象生成即可,然而字体的大小和居中成果是须要额定定义款式 style 的,所以这部分代码比拟突兀,大家看懂即可。

如下代码:

def process_xls_return_data(xls_name):
    staff_number = 0  # 总人数字段
    cd_number = 0  # 早退人数字段
    jj_number = 0  # 拿奖金人数字段
    total_pay = 0  # 总应发工资字段
    wb = xlrd.open_workbook(xls_name, formatting_info=True)
    wb_sheet = wb.sheet_by_index(0)
    xwb = copy(wb)
    xwb_sheet = xwb.get_sheet('sheet1')
    rows = wb_sheet.nrows
    for row in range(1, rows):
        staff_number = staff_number + 1  # 每个数据都是一个员工,间接 +1
        bm = wb_sheet.cell(row, 0).value  # 部门名称
        xm = wb_sheet.cell(row, 1).value
        gh = wb_sheet.cell(row, 2).value
        gz = wb_sheet.cell(row, 3).value
        cdcs = wb_sheet.cell(row, 4).value
        if cdcs > 0:  # 如果早退次数大于 0,则是早退过的人,早退人数 +1
            cd_number = cd_number + 1
        jj = wb_sheet.cell(row, 5).value
        if jj > 0:  # 如果奖金大于 0,则是取得了奖金的人,拿奖金人数 +1
            jj_number = jj_number + 1
        sfgz = gz - (cdcs * 20) + jj  # 实发工资 = 工资  -(早退次数 *20)+  奖金
        total_pay = total_pay + sfgz  # 将所有的实发工资加到一起,就是总的实发工资
        print(bm, xm, gh, gz, cdcs, jj, sfgz)
        xwb_sheet.write(row, 6, sfgz)
    xwb.save(xls_name)
    print([bm, staff_number, cd_number, jj_number, total_pay])
    return [bm, staff_number, cd_number, jj_number, total_pay]  # 最初将部门 总人数  总早退人数  总拿奖金人数  总实发工资做成列表,一并返回


all_info = []
for cls in need_process_xls:
    one_partment = process_xls_return_data(cls)
    all_info.append(one_partment)  # 将函数的返回值,放到列表中,就失去了所有部门的统计信息

wb = xlrd.open_workbook(template_name, formatting_info=True)
wb_sheet = wb.sheet_by_index(0)
xwb = copy(wb)
xwb_sheet = xwb.get_sheet('Sheet1')
current_row = wb_sheet.nrows
year_month = datetime.datetime.now().strftime("%Y-%m")
title = "{}- 各部门员工数据总览"


def create_style():  # 定义字体格局,返回一个字体大小 24,垂直居中 程度居中 宋体格局 的款式
    style = xlwt.XFStyle()
    fnt = xlwt.Font()  # 创立一个文本格式,包含字体、字号和色彩款式个性
    fnt.name = u'宋体'
    fnt.height = 20 * 24
    alignment = xlwt.Alignment()
    alignment.horz = 0x02  # 0x01(左端对齐)、0x02(程度方向上居中对齐)、0x03(右端对齐)
    alignment.vert = 0x01  # 0x00(上端对齐)、0x01(垂直方向上居中对齐)、0x02(底端对齐)
    style.font = fnt
    style.alignment = alignment
    return style


xwb_sheet.write(0, 0, title.format(year_month), create_style())  # 写入头部题目,内容是“xxxx-xx- 各部门员工数据总览”,款式是 宋体 大小 24 垂直程度居中

for info in all_info:  # 循环所有的部门信息,全副写入到文件中
    xwb_sheet.write(current_row, 0, info[0])
    xwb_sheet.write(current_row, 1, info[1])
    xwb_sheet.write(current_row, 2, info[2])
    xwb_sheet.write(current_row, 3, info[3])
    xwb_sheet.write(current_row, 4, info[4])
    current_row = current_row + 1
xwb.save(title.format(year_month) + '.xls')  # 最初保留,文件名是 xxxx-xx- 各部门员工数据总览.xls

这个代码是基于上一个函数代码的,多了部门信息统计和基于模板文件生成”xxxx-xx- 各部门员工数据总览.xls“的统计文件

以上就是本次工作的实现过程。联合代码块 1 和代码块 3,就是残缺的代码块。

源码中有文中的全副代码文件,蕴含“ 批量生成财务报表.ipynb”的代码文件,能够主动生成任意多个部门和任意多个员工的财务文件。

欢送关注我公众号:AI 悦创,有更多更好玩的等你发现!

details 公众号:AI 悦创【二维码】

::: info AI 悦创·编程一对一

AI 悦创·推出辅导班啦,包含「Python 语言辅导班、C++ 辅导班、java 辅导班、算法 / 数据结构辅导班、少儿编程、pygame 游戏开发」,全部都是一对一教学:一对一辅导 + 一对一答疑 + 安排作业 + 我的项目实际等。当然,还有线下线上摄影课程、Photoshop、Premiere 一对一教学、QQ、微信在线,随时响应!微信:Jiabcdefh

C++ 信息奥赛题解,长期更新!长期招收一对一中小学信息奥赛集训,莆田、厦门地区有机会线下上门,其余地区线上。微信:Jiabcdefh

办法一:QQ

办法二:微信:Jiabcdefh

:::

正文完
 0