python - 操作excel表格
说明:由于公司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格式文本

原始数据.xls

外出.xls

请假.xls

法定假日.xls

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 利用Python操作excel表格之openyxl介绍Part2
利用Python操作excel表格之openyxl介绍 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群(群号:7156436) ## 绘图 c = LineChart() ...
- Python 利用Python操作excel表格之openyxl介绍Part1
利用Python操作excel表格之openyxl介绍 by:授客 QQ:1033553122 欢迎加入全国软件测试交流qq群(群号:7156436),免费获取以下性能监控工具(类似Nmon精简版) ...
- 【转】python操作excel表格(xlrd/xlwt)
[转]python操作excel表格(xlrd/xlwt) 最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异, ...
- Python 利用Python操作excel表格之xlwt介绍
利用Python操作excel表格之xlwt介绍 by:授客 QQ:1033553122 直接上代码 案例1 #!/usr/bin/env python # -*- coding:utf-8 ...
- 转载:python操作excel表格(xlrd/xlwt)
python操作excel表格(xlrd/xlwt) 最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而 ...
- python操作excel表格(xlrd/xlwt)
最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而且不太能满足需求,不过经过一番对源码的"研究&q ...
- Python操作excel表格
用Python操作Excel在工作中还是挺常用的,因为毕竟不懂Excel是一个用户庞大的数据管理软件 注:本篇代码在Python3环境下运行 首先导入两个模块xlrd和xlwt,xlrd用来读取Exc ...
- Python操作Excel表格,xlwt模块的使用
Python可以操作Excel的模块不止一种,我习惯使用的写入模块是xlwt(一般都是读写模块分开的) 按照模块使用pip install xlwt 就行了,很常规的方式 直接进代码解析,本文源码 w ...
- 28.python操作excel表格(xlrd/xlwt)
python读excel——xlrd 这个过程有几个比较麻烦的问题,比如读取日期.读合并单元格内容.下面先看看基本的操作: 首先读一个excel文件,有两个sheet,测试用第二个sheet,shee ...
随机推荐
- jvm面试题 新生代和 老年代的区别
新生代和老年代的区别(阿里面试官的题目): 所谓的新生代和老年代是针对于分代收集算法来定义的,新生代又分为Eden和Survivor两个区.加上老年代就这三个区.数据会首先分配到Eden区 当中(当然 ...
- Nginx 常用配置方式说明
原文内容来自于LZ(楼主)的印象笔记,如出现排版异常或图片丢失等问题,可查看当前链接:https://app.yinxiang.com/shard/s17/nl/19391737/7619763f-1 ...
- C#线程学习笔记三:线程池中的I/O线程
本笔记摘抄自:https://www.cnblogs.com/zhili/archive/2012/07/20/MultiThreads.html,记录一下学习过程以备后续查用. 一.I/O线 ...
- MongoDB(七):聚合aggregate
1. 聚合aggregate 聚合主要用于计算数据,类似sql中的sum().avg() 语法: db.集合名称.aggregate([{管道:{表达式}}]) stu准备的数据: db.stu.in ...
- 松软科技Web课堂:JavaScript For 循环
循环可多次执行代码块. JavaScript 循环 假如您需要运行代码多次,且每次使用不同的值,那么循环(loop)相当方便使用. 通常我们会遇到使用数组的例子: 不需要这样写: text += ca ...
- Android 音视频技术之录音获取实时音量
一.实时音量相关基础知识 说到获取音量,大家首先想到的应该就是分贝(dB),分贝是一个相对单位(是一个比值,是一个数值,是一个纯计数方法). 在音频领域dB度量的是声音的强度,其计算的公式如下: 在上 ...
- day04逻辑运算符短路、多分支结构(if和switch)、循环结构、while循环
复习 1.运算符和表达式 1)表达式 2)算数运算符 + - * / % 3)关系运算符 > < >= <= == != 4)逻辑运算符 && | ...
- 看懂 游戏《Minecraft》的崩溃报告 服务端/客户端
如何看懂Minecraft报错的关键信息. 让你如何看懂Minecraft报错 前言 一些俏皮话 寻找崩溃日志 打开崩溃日志 重要的事说三遍 下载文本编辑器 开始分析 深度分析 得出结论 修复报错 解 ...
- 如何实现一台服务器同时运行两个php版本
有需要学习交流的友人请加入交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群jq.qq.com 假设您已经安装了Apache,为这两个项目创建了虚拟主机,并添加 ...
- Jenkins使用SSH构建Go项目并执行
目录 下载插件 配置要部署的服务器 构建项目 Jenkinx可以帮助我们通过SSH插件,将项目直接部署到指定的服务器. 下载插件 (1)点击左侧的"系统管理"菜单 ,然后点击 (2 ...