python解析excel发放工资 (python工作表自动汇总所有月份)

#Python财务工具#

#Python将工资统计表处理成为工资条#

很多小企业没有公司内部的财务平台,在处理员工工资的时候还是采用Excel表格进行统计,每当到发工资和工资条的时候,需要将每个人的工资明细表头及工资数额复制多次做成工资条样式,再打印裁剪并分发。这样对于财务人员来说,费时费力。故本人在借鉴朋友一个复杂工时统计表编写该程序。处理结果如下两表。

处理前的表格

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

1

周某

2021

2

15

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

2

武某

2021

2

15

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

3

王某

2021

2

15

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

4

李某

2021

2

15

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

5

商某

2021

2

16

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

6

何某

2021

2

17

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

7

冯某

2021

2

18

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

8

元谋

2021

2

19

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

9

刘某

2021

2

19

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

10

赵某

2021

2

19

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

11

张某

2021

2

19

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

12

孙某

2021

2

19

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

处理后的表格

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

1

周某

2021

2

15

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

2

武某

2021

2

15

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

3

王某

2021

2

15

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

4

李某

2021

2

15

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

5

商某

2021

2

16

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

6

何某

2021

2

17

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

7

冯某

2021

2

18

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

8

元谋

2021

2

19

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

9

刘某

2021

2

19

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

10

赵某

2021

2

19

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

11

张某

2021

2

19

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

上海分公司工资发放明细

序号

姓名

会计年度

会计期间

职务级别

职务工资

级别工资

工龄补贴

司龄补贴

应发合计

个人养老缴费

个人医疗缴费

个人失业缴费

公积金个人缴存

补充公积金个人缴存

年金个人缴存

代扣上个月税

本月扣款合计

工资实发金额

赡养父母专项累计

子女教育专项累计

住房*款贷**专项累计

累计已扣税

月度工资分配

绩效应发金额

绩效实发金额

总实发合计

签字

12

孙某

2021

2

19

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

1

Python源代码如下:

from openpyxl import Workbook, load_workbook
from openpyxl.styles import fills,colors,NamedStyle,Font,Side,Border,PatternFill,Alignment,Protection
import openpyxl
import datetime
import sys
"""先用一个类来实现一些表格的操作"""
class ExcelUtils():
    """获取Excel表格内容"""
    # def __init__(self,excelfilepath,sheet_name):
    #     print(excelfilepath, sheet_name)
    #     self.excelfilepath = excelfilepath # excelfilepath 为excel文件的完整路径
    #     self.sheet_name = sheet_name       #sheet_name为excel表的sheet名称
    #     self.ws = self.getsheet()          #python的类可以在初始化方法中调用类的其他方法
    def __init__(self, excelfilepath):
        print(excelfilepath)
        self.excelfilepath = excelfilepath  # excelfilepath 为excel文件的完整路径
        self.ws = self.getsheet()  # python的类可以在初始化方法中调用类的其他方法

    def getsheet(self):
        self.wb = openpyxl.load_workbook(self.excelfilepath, data_only=True) # 获取整个excel表对象
        sheet_names = self.wb.sheetnames
        ws = self.wb[sheet_names[len(sheet_names) - 1]]
        return ws

    def get_row_count(self):
        row_count =self.ws.max_row #获取当前sheet的最大行数
        return row_count

    def __get_cell_value(self,row_index, col_index):
    # def get_cell_value(self, row_index, col_index):
        cell_value = self.ws.cell(row_index,col_index).value
        # 根据入参的值获取单元格的数据,两个下划线表示类的私有化方法
        return cell_value

    def get_colum_count(self):
        colum_count =self.ws.max_column #获取当前sheet的最大列数
        return colum_count

    def get_merged_info(self):
        # 获取合并单元格的坐标范围,例如:“C1: D2”
        merged_info = self.ws.merged_cells
        return merged_info

    def get_merged_cell_value(self,row_index, col_index):
        """
        既能获取普通单元格的数据又能获取合并单元格数据
        row_index和col_index,最小行和最小列请传1
        该方法的原理为将合并单元格的范围都视为获取合单元格左上角第一个普通单元格的值
        """
        cell_value = None
        mergedlist = self.get_merged_info()
        for merged in mergedlist:
            # 将获取到的单元格对象拆分为四个值
            row_start, row_end, colum_start, colum_end = merged.min_row, merged.max_row, merged.min_col, merged.max_col
            if row_index >= row_start and row_index <= row_end:
                if col_index >= colum_start and col_index <= colum_end:
                    cell_value = self.__get_cell_value(row_start, colum_start)
                    break  # 防止循环去进行判断出现值覆盖的情况。找到了想要的值,就不能再继续找了,必须直接跳出循环,返回出去
                else:
                    cell_value = self.__get_cell_value(row_index, col_index)
            else:
                cell_value = self.__get_cell_value(row_index, col_index)
        return cell_value # 返回的就是合并单元的值,为字符串类型
    def get_first_row(self):
        # 获取第一行的数据
        columns = excelutils.ws.max_column #获取最大列数
        rowdata = []
        for i in range(1, columns + 1): # range函数的结束数字本身并不执行,所以需要+1
            cellvalue = excelutils.ws.cell(row=1, column=i).value
            rowdata.append(cellvalue)
        print(rowdata)
        return rowdata

    def get_sheet_data_by_dict(self):
        #将整个sheet列表除了第一行以外的内容全部作为字典的值进行储存
        rowdata = self.get_first_row()
        all_sheet_value_dict = []
        for row in range(1, self.ws.max_row ):
            valuedict = {}
            for col in range(1, self.ws.max_column + 1):
                valuedict[rowdata[col - 1]] = self.get_merged_cell_value(row + 1, col)
            all_sheet_value_dict.append(valuedict)
        return all_sheet_value_dict

    def save_excle(self):
        self.wb.save(self.excelfilepath)
excel_name = "XXXXXXXX中国XX上海中心工资条.xlsx"
salarysheet = ExcelUtils(excel_name)

'''获取合并的单元格内容,保存在title_head里面'''
title_head = []
title_head.append(salarysheet.get_merged_cell_value(1, 1))
# print(title_head)
'''获取第二行工资详细项'''
item_head=[]
for i in range(1,salarysheet.get_colum_count()+1):
    item_head.append(salarysheet.get_merged_cell_value(2,i))
# print(item_head)
'''获取每个单元格的内容保存在num_list'''
num_list = []
for i in range(3, salarysheet.get_row_count()+1):
    for j in range(1, salarysheet.get_colum_count()+1):
        num_list.append(salarysheet.get_merged_cell_value(i, j))
# print(num_list)
#保存写操作
process_time = datetime.datetime.now()
date_str = process_time.strftime('%Y%m%d%H%M%S')
ws2 = salarysheet.wb.create_sheet("中国XX上海中心个人工资条" + date_str, 0)

"""先找一个字体的模板"""
my_alignment = Alignment(
    horizontal = 'general', # 水平:常规
    vertical = 'bottom',   # 垂直:底部对齐
    text_rotation = 0,   # 文本方向:0度
    wrap_text = False,   # 自动换行
    shrink_to_fit = False,  # 缩小字体填充
    indent = 0 # 缩进0
  )

"""定义好大标题和小标题的字体样式"""
font = Font('黑体', size=12, color=colors.BLACK, bold=False)
font_items = Font('黑体', size=10, color=colors.BLACK, bold=False)

"""设置合并单元格并写入数据和更改字体样式"""
my_alignment1 = Alignment(horizontal='center', vertical='center', wrap_text = True)
for i in range(1, (salarysheet.get_row_count()-2)*4, 4):
    ws2.merge_cells(start_row=i, start_column=1, end_row=i, end_column=28)
    ws2.cell(i, 1).alignment = my_alignment1
    ws2.cell(i, 1).font = font
    ws2.cell(i, 1).value = title_head[0]
    ws2.merge_cells(start_row=i+3, start_column=1, end_row=i+3, end_column=28)

"""写入单个单元格的数据并设置样式"""
index_num_data = 0
for row in range(1, (salarysheet.get_row_count()-2)*4, 4):
    for i in range(1, salarysheet.get_colum_count()+1):
        ws2.cell(row+1, i).alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
        ws2.cell(row+1, i).font = font_items
        ws2.cell(row+1, i).value = item_head[i-1]
        ws2.cell(row+2, i).alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
        ws2.cell(row+2,i).font=font_items
        ws2.cell(row+2, i).value = num_list[index_num_data]
        index_num_data += 1

"""设置某些指定单元格的宽度"""
letter_A = chr(65)
letter_B = chr(66)
ws2.column_dimensions[chr(65)].width = 12
ws2.column_dimensions[letter_A+letter_B].width = 14
salarysheet.save_excle()
print('完成!')

欢迎点赞,评论,转发,交流。您的支持就是我的动力,谢谢。