1、需求来源/项目背景
某天去找HR小姐姐有点事处理,过去后HR小姐姐说快忙死了,请稍等一会,聊天中知道HR小姐姐在统计一个月考勤记录,统计出起早贪黑榜
,起早
:就是早上打卡时间在9:30
之前的上班打开,算是早到;贪黑
:就是在晚上20:30
之后的下班打卡,另外这个榜单涉及到补助。而HR小姐姐在统计的考勤记录是某钉进行考勤后输出的 xxx.xlsx
的表格文档。
2、需求分析
打开表格后,出现的数据如下图:
发现:
- 标题显示了
姓名
、日期
- 每个人的打开数据按照一行进行排列
- 打卡时间为0到多次,有多人多记录里出现一天超过2次的记录
- 打开时间格式为
xx:xx
, 例如:09:30
实现分析
1.要将原始表格内容读取到 程序中
,选择Python脚本
2.通过一定的计算、统计
3.将结果按照一定的格式,输出到Excel中,方便阅读
3、需求实现
1.要将原始表格内容读取到 程序中
,选择Python脚本
data = xlrd.open_workbook(file_name) # 读取数据
2.通过一定的计算、统计
page = len(data.sheets()) # 获取sheet的数量
for i in range(page):
table = data.sheets()[i]
# print(table.name, i)
result_sheet = result.add_sheet(table.name) # 写sheet name
result_cols = 0
for row_result in range(len(result_title)):
result_sheet.write(result_cols, row_result, result_title[row_result]) # 写标题
n_rows = table.nrows # 获取总行数
n_cols = table.ncols # 获取总列数
for row in range(n_rows):
advance = 0
go_late = 0
name = table.cell_value(row, 0)
# print('name = %s , is name = %s' % (name, (name == IGNORE_NAME)))
if name == IGNORE_NAME:
continue
for col in range(n_cols):
cell_data = table.cell_value(row, col)
string_date = str.strip(cell_data)
string_date = string_date.replace(' ', '')
string_date = string_date.replace('\'', '')
split_date = string_date.split('\n')
advance_flag = 0
go_late_flag = 0
for index in range(len(split_date)):
time = split_date[index]
# if 'NeWolf' == name and len(time) > 2:
# print('time = %s' % time)
if len(time) > 6:
# print('len(time) > 6 time = %s' % time)
continue
if not time.__contains__(":"):
# if not '' == time:
# print('not time = %s' % time)
continue
# print('normal time = %s' % time)
is_advance = ADVANCE_START <= time <= ADVANCE_END
if is_advance:
advance_flag = 1
# print('is_advance = %s time = %s' % (is_advance, time))
is_late = GO_LATE_START <= time <= GO_LATE_END or \
GO_LATE_TOMORROW_START <= time <= GO_LATE_TOMORROW_END
if is_late:
go_late_flag = 1
# print('is_late = %s time = %s' % (is_late, time))
advance += advance_flag
go_late += go_late_flag
# print(split_date)
if advance != 0 or go_late != 0:
total_advance_money = advance * ADVANCE_MONEY
total_go_late_money = go_late * GO_LATE_MONEY
total_money = total_advance_money + total_go_late_money
# print(
# 'name %s , advance = %s, total_advance_money = %s ,go_late = %s , total_go_late_money = %s , '
# 'total_money = %s' % (
# name, advance, total_advance_money, go_late, total_go_late_money, total_money))
person_stats = [name, advance, total_advance_money, go_late, total_go_late_money, total_money]
result_cols += 1
for row_result in range(len(person_stats)):
result_sheet.write(result_cols, row_result, person_stats[row_result])
result_cols += 3
import time
use_time = time.time() - start_time
3.将结果按照一定的格式,输出到Excel中,方便阅读
result = xlwt.Workbook()
result_title = ['姓名', '起早', '金额(15元/天)', '贪黑', '金额(25元/天)', '起早贪黑合计补助(元)']
...
result_sheet = result.add_sheet(table.name) # 写sheet name
result_cols = 0
for row_result in range(len(result_title)):
result_sheet.write(result_cols, row_result, result_title[row_result]) # 写标题
...
person_stats = [name, advance, total_advance_money, go_late, total_go_late_money, total_money]
result_cols += 1
for row_result in range(len(person_stats)):
result_sheet.write(result_cols, row_result, person_stats[row_result])
4、实现结果
发现格式有点不美观,优化一下下
OK,搞定。
5、遗留问题
- 输出的Excel格式需要人工美化,是否可以通过代码进行呢?
- 想做一个写入加密,但是还没搞定
6、思考
忘了是谁说的了
- 用科技让复杂的世界更简单
- 让世界沟通更简单
人工处理这种重复性内容,眼睛好累还容易出错,时间还长,人工处理大概需要1天,而程序只需要不到 1s 。
7、参考内容
8、END
感谢您的阅读,源码请参考https://github.com/newsolf/AutoTimeSheet
网友评论