说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通过几个excel表格去交叉比对员工是否有旷工或迟到,工作量大而且容易出错。
这时候it屌丝的机会来啦,花了一天时间给妹子撸了一个自动化脚本。
1. 下载相关python包
python操作excel表格可以使用以下三个包
xlrd - 读excel文件
xlwt - 写excel文件,这个不能修改已有的excel文件,只能写新的文件
xlutils - 修改excel文件,其实就是通过xlrd拷贝一份记录,再进行修改。保存为老的名字就替换了原文件,保存为新的名字就创建一个新文件
注意事项:
a. python读取excel的日期和时间时
表格内容是2019/5/13,python读到的值是43606.0,该值为从日期减1899/12/30得到的天数
表格内容是9:00:00,python读到的值是0.375,该值为时间过了一天的比例,即9/24
表格内容是2019/5/13 9:00:00,python读到的值是43598.375
日期和时间可以直接相加,因为python读到的都是转化为数字之后的值
b. python读取excel的数字时,如员工编号为181129,最后结果是181129.0,非整数
c. 调用save函数保存新的excel文件时,后缀名必须是.xls
2. 将python文件转为.bat格式
你不可能要求妹子去使用cmd,然后使用python xx.py去执行python文件,必须想个办法搞成傻瓜式的。我们可以通过.bat格式文件实现
新建文本文件,重命名为“A考勤小工具.bat”,输入下面代码,@py.exe表示后面的参数是python可执行文件
@py.exe Akqfx.py
3. 附上相关代码和excel格式文本
Akqfx.py
# 该脚本为修正考勤记录 # author: yangbao import os from datetime import datetime import xlrd from xlutils.copy import copy # 定义文件是否存在 def get_list_file(): current_list = os.listdir() must_list = ['原始数据.xls', '外出.xls', '法定假日.xls', '请假.xls'] cj_set = set(must_list) - set(current_list) if cj_set: for i in cj_set: print('{} 不存在,请检查!'.format(i)) return 0 else: return 1 # 定义是否存在流程 def get_qjorwc(file_name, person_id, input_time): book = xlrd.open_workbook(file_name) book_sheet = book.sheet_by_index(0) flag = 0 for i in range(1, book_sheet.nrows): if int(book_sheet.cell_value(i, 1)) == int(person_id): # 文件不同,时间处理不同 if file_name == '请假.xls': cell_begin = book_sheet.cell_value(i, 4) cell_end = book_sheet.cell_value(i, 5) else: cell_begin = book_sheet.cell_value(i, 3) + book_sheet.cell_value(i, 4) cell_end = book_sheet.cell_value(i, 5) + book_sheet.cell_value(i, 6) # 判断原始数据旷工和迟到是否在请假或外出流程里 # 给额外5min的宽限时间 if cell_begin-5/1440 <= input_time <= cell_end+5/1440: flag = 1 break return flag # 定义是否是法定假日 def get_fdjr(input_time): book = xlrd.open_workbook('法定假日.xls') book_sheet = book.sheet_by_index(0) flag = 0 for i in range(1, book_sheet.nrows): dt = datetime(*xlrd.xldate_as_tuple(book_sheet.cell_value(i, 0), 0)) if dt.strftime('%Y-%m-%d') == input_time: flag = 1 break return flag def main(): ys_book = xlrd.open_workbook('原始数据.xls') ys_book_sheet = ys_book.sheet_by_index(0) new_ys_book = copy(ys_book) new_ys_book_sheet = new_ys_book.get_sheet(0) unnormal_list = ['旷工', '迟到'] for i in range(ys_book_sheet.nrows): # 查上班时间 if ys_book_sheet.cell_value(i, 5) in unnormal_list: # 查是否是法定假日 dt = ys_book_sheet.cell_value(i, 3)[:10] if get_fdjr(dt): new_ys_book_sheet.write(i, 5, '*') # 查是否有流程 if ys_book_sheet.cell_value(i, 4) != '': cell_on_time = ys_book_sheet.cell_value(i, 3)[:10] + ' ' + ys_book_sheet.cell_value(i, 4) cell_on_time_format = datetime.strptime(cell_on_time, "%Y-%m-%d %H:%M:%S") - datetime.strptime('1899-12-30', '%Y-%m-%d') cell_on_time_number = cell_on_time_format.days + cell_on_time_format.seconds / (24 * 3600) if 12 < cell_on_time_format.seconds / 3600 < 13: cell_on_time_number = cell_on_time_format.days + 11.5/24 else: cell_on_time = ys_book_sheet.cell_value(i, 3)[:10] cell_on_time_format = datetime.strptime(cell_on_time, "%Y-%m-%d") - datetime.strptime('1899-12-30', '%Y-%m-%d') cell_on_time_number = cell_on_time_format.days + cell_on_time_format.seconds / (24 * 3600) + 9/24 qj_on_flag = get_qjorwc('请假.xls', ys_book_sheet.cell_value(i, 1), cell_on_time_number) wc_on_flag = get_qjorwc('外出.xls', ys_book_sheet.cell_value(i, 1), cell_on_time_number) if qj_on_flag == 1 or wc_on_flag == 1: new_ys_book_sheet.write(i, 5, '已有流程') new_ys_book_sheet.write(i, 11, '') # 查下班时间 if ys_book_sheet.cell_value(i, 7) in unnormal_list: # 查是否是法定假日 dt = ys_book_sheet.cell_value(i, 3)[:10] if get_fdjr(dt): new_ys_book_sheet.write(i, 7, '*') new_ys_book_sheet.write(i, 11, '') # 查是否有流程 if ys_book_sheet.cell_value(i, 6) != '': cell_out_time = ys_book_sheet.cell_value(i, 3)[:10] + ' ' + ys_book_sheet.cell_value(i, 6) cell_out_time_format = datetime.strptime(cell_out_time, "%Y-%m-%d %H:%M:%S") - datetime.strptime('1899-12-30', '%Y-%m-%d') cell_out_time_number = cell_out_time_format.days + cell_out_time_format.seconds / (24 * 3600) if 12 < cell_out_time_format.seconds / 3600 < 13: cell_out_time_number = cell_out_time_format.days + 13.5/24 else: cell_out_time = ys_book_sheet.cell_value(i, 3)[:10] cell_out_time_format = datetime.strptime(cell_out_time, "%Y-%m-%d") - datetime.strptime('1899-12-30', '%Y-%m-%d') cell_out_time_number = cell_out_time_format.days + cell_out_time_format.seconds / (24 * 3600) + 18/24 qj_out_flag = get_qjorwc('请假.xls', ys_book_sheet.cell_value(i, 1), cell_out_time_number) wc_out_flag = get_qjorwc('外出.xls', ys_book_sheet.cell_value(i, 1), cell_out_time_number) if qj_out_flag == 1 or wc_out_flag == 1: new_ys_book_sheet.write(i, 7, '已有流程') new_ys_book_sheet.write(i, 11, '') new_excel_name = datetime.now().strftime('%Y%m%d_%H%M%S')+'校正后.xls' new_ys_book.save(new_excel_name) if __name__ == '__main__': if get_list_file(): print('开始考勤分析...') main() print('考勤分析结束...') input('按任意键结束') else: input('因为缺少相关excel文件,考勤分析失败,退出程序,按任意键结束')
该文档仅作个人记录用
以上就是python 操作excel表格的方法的详细内容,更多关于python 操作excel表格的资料请关注其它相关文章!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。
更新动态
- 凤飞飞《我们的主题曲》飞跃制作[正版原抓WAV+CUE]
- 刘嘉亮《亮情歌2》[WAV+CUE][1G]
- 红馆40·谭咏麟《歌者恋歌浓情30年演唱会》3CD[低速原抓WAV+CUE][1.8G]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[320K/MP3][193.25MB]
- 【轻音乐】曼托凡尼乐团《精选辑》2CD.1998[FLAC+CUE整轨]
- 邝美云《心中有爱》1989年香港DMIJP版1MTO东芝首版[WAV+CUE]
- 群星《情叹-发烧女声DSD》天籁女声发烧碟[WAV+CUE]
- 刘纬武《睡眠宝宝竖琴童谣 吉卜力工作室 白噪音安抚》[FLAC/分轨][748.03MB]
- 理想混蛋《Origin Sessions》[320K/MP3][37.47MB]
- 公馆青少年《我其实一点都不酷》[320K/MP3][78.78MB]
- 群星《情叹-发烧男声DSD》最值得珍藏的完美男声[WAV+CUE]
- 群星《国韵飘香·贵妃醉酒HQCD黑胶王》2CD[WAV]
- 卫兰《DAUGHTER》【低速原抓WAV+CUE】
- 公馆青少年《我其实一点都不酷》[FLAC/分轨][398.22MB]
- ZWEI《迟暮的花 (Explicit)》[320K/MP3][57.16MB]