python 操作excel表格的方法


Posted in Python onDecember 05, 2020

说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通过几个excel表格去交叉比对员工是否有旷工或迟到,工作量大而且容易出错。
这时候it?潘康幕?崂蠢玻??艘惶焓奔涓?米舆A艘桓鲎远??疟尽?/p>

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格式文本

python 操作excel表格的方法

python 操作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表格的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python使用pil生成图片验证码的方法
May 08 Python
Python基于checksum计算文件是否相同的方法
Jul 09 Python
Windows下Python的Django框架环境部署及应用编写入门
Mar 10 Python
Python 类与元类的深度挖掘 II【经验】
May 06 Python
python 列表删除所有指定元素的方法
Apr 19 Python
python使用openpyxl库修改excel表格数据方法
May 03 Python
Django Web开发中django-debug-toolbar的配置以及使用
May 06 Python
Python比较配置文件的方法实例详解
Jun 06 Python
Python List列表对象内置方法实例详解
Oct 22 Python
关于PySnooper 永远不要使用print进行调试的问题
Mar 04 Python
python实现语音常用度量方法的代码详解
May 25 Python
python not运算符的实例用法
Jun 30 Python
解决python 执行shell命令无法获取返回值的问题
Dec 05 #Python
Python 利用flask搭建一个共享服务器的步骤
Dec 05 #Python
快速解决pymongo操作mongodb的时区问题
Dec 05 #Python
pymongo insert_many 批量插入的实例
Dec 05 #Python
python 写一个文件分发小程序
Dec 05 #Python
解决Pymongo insert时会自动添加_id的问题
Dec 05 #Python
用python对oracle进行简单性能测试
Dec 05 #Python
You might like
PHP5+UTF8多文件上传类
2008/10/17 PHP
php定义参数数量可变的函数用法实例
2015/03/16 PHP
PHP读取汉字的点阵数据
2015/06/22 PHP
WordPress迁移时一些常见问题的解决方法整理
2015/11/24 PHP
PHP strip_tags() 去字符串中的 HTML、XML 以及 PHP 标签的函数
2016/05/22 PHP
PHP运用foreach神奇的转换数组(实例讲解)
2018/02/01 PHP
PHP高并发和大流量解决方案整理
2019/12/24 PHP
javascript IFrame 强制刷新代码
2009/07/23 Javascript
JavaScript 拾碎[三] 使用className属性
2010/10/16 Javascript
Jquery 选中表格一列并对表格排序实现原理
2012/12/15 Javascript
js控制div弹出层实现方法
2015/05/11 Javascript
详解js跨域原理以及2种解决方案
2015/12/09 Javascript
JS控制静态页面传递参数并获取参数应用
2016/08/10 Javascript
在JavaScript中调用Java类和接口的方法
2016/09/07 Javascript
基于bootstrap的文件上传控件bootstrap fileinput
2016/12/23 Javascript
Bootstrap导航条学习使用(二)
2017/02/08 Javascript
Bootstrap表格使用方法详解
2017/02/17 Javascript
react-native封装插件swiper的使用方法
2018/03/20 Javascript
基于vue v-for 多层循环嵌套获取行数的方法
2018/09/26 Javascript
微信小程序实现留言板
2018/10/31 Javascript
vue视图不更新情况详解
2019/05/16 Javascript
js实现随机点名程序
2020/09/17 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
用Python中的字典来处理索引统计的方法
2015/05/05 Python
JPype实现在python中调用JAVA的实例
2017/07/19 Python
pandas DataFrame 根据多列的值做判断,生成新的列值实例
2018/05/18 Python
Python中return self的用法详解
2018/07/27 Python
Python基于Tensor FLow的图像处理操作详解
2020/01/15 Python
Python使用plt.boxplot() 参数绘制箱线图
2020/06/04 Python
将HTML5 Canvas的内容保存为图片借助toDataURL实现
2013/05/20 HTML / CSS
马来西亚和新加坡巴士票在线预订:CatchThatBus
2018/11/17 全球购物
Linux Interview Questions For software testers
2012/06/02 面试题
节约用水倡议书
2014/04/16 职场文书
民事辩护词范文
2015/05/21 职场文书
会议承办单位欢迎词
2019/07/09 职场文书
pyqt5蒙版遮罩mask,setmask的使用
2021/06/11 Python