学生考勤报表管理小程序
该学生考勤管理小程序是给朋友的写的一个小demo,技术含量不高,难度也不大。放出来就是做个日常记录,有需要的小伙伴可以参考。
本demo处理的考勤表格式如下:在一个Excel表中有多个子列表,每个子列表中有三个员工的个人信息:部门、姓名、工号,周一至周五的打卡信息等。
首先要解决的就是加载Excel表格,然后遍历每一个子列表,依次读取每个子列表中的信息。我使用的是xlrd库配合pandas库做一系列操作(安装库很简单,不会的百度即可,pip install xlrd/pandas)。只截取了部分代码。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
__author__: "TC"
import xlrd
import xlwt
from pandas import DataFrame
# 打开工作表
workbook = xlrd.open_workbook('考勤报表.xls')
# 获取所有的工作薄
sheets = workbook.sheet_names()
# 获取sheet总个数
print(workbook.nsheets)
num = workbook.nsheets
# 返回的结果集
person_num = []
person_num1 = []
person_num2 = []
# 遍历每一个子列表
for i in range(num):
sheet = workbook.sheets()[i]
print(f'第 {str(i + 1)} 个sheet: {sheet.name} ')
rows = sheet.nrows
获得了每个子列表的信息后,接下来就是通过切片的形式只需要拿到想要处理的范围即可。这里需用到DataFrame的功能,获得表格的行索引和列索引便于后面的切片操作。其实后面的一系列操作就是通过行列的索引进行表格信息的定位读取,然后存放在列表中。
row_list = []
row_list1 = []
row_list2 = []
for i in range(1, rows):
# print(i)
# print(sheet.row_values(i))
row_data = sheet.row_values(i)
row_data_main = DataFrame(row_data)
row_data = row_data_main.loc[0:12]
row_list.append(row_data)
通过切片读取到员工信息后,接下来就是对考勤情况的判断处理了,是否签到、签退、缺勤等。对于缺勤的判断很简单就是判断单元格是否为空,这里就需要xlrd库的帮助了,用到写下面两个语句即可。
xlrd.XL_CELL_EMPTY, xlrd.XL_CELL_BLANK
然后对于是否迟到、早退,用if_elif_else语句判断即可。这里需要说明的是表格给的信息是二十四小时制的,不好直接判断,我采用的是单元格的文本格式(替代二十四小时制)进行判断的,比较方便。
最后,将处理后得到的信息简单的保存在Excel中便于查看(你不可能直接让人看你的pycharm编辑框吧)。保存时采用了xlwt库处理。
file = 'test.xlsx'
wb = xlwt.Workbook(file)
new_sheet = wb.add_sheet('结果', cell_overwrite_ok=True)
row = ['one']
row1 = ['two']
row2 = ['three']
for i in range(0, len(row)):
new_sheet.write(0, i, row[i])
for i in range(0, len(person_num)):
new_sheet.write(i + 1, 0, person_num[i])
for i in range(0, len(row1)):
new_sheet.write(0, i + 1, row1[i])
for i in range(0, len(person_num1)):
new_sheet.write(i + 1, 1, person_num1[i])
for i in range(0, len(row2)):
new_sheet.write(0, i + 2, row2[i])
for i in range(0, len(person_num2)):
new_sheet.write(i + 1, 2, person_num2[i])
new_sheet.col(0).width = 256 * 50#使得内容在表格中显示的更全
new_sheet.col(1).width = 256 * 50
new_sheet.col(2).width = 256 * 50
wb.save('test.xls')
最后结果如下,核对后没有错误。
这只是一个初级demo,处理得很草率,且针对不同的表格信息,部分细节要做变动,但总的思路是一致的,等有空了再优化一下,可以结合PyQt5/HTML做个界面,用Flask框架做一个Web页面更完美。目前仅用于参考学习,欢迎指正,互相学习!