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 相关文章推荐
Pyramid将models.py文件的内容分布到多个文件的方法
Nov 27 Python
Python字符串特性及常用字符串方法的简单笔记
Jan 04 Python
Python缩进和冒号详解
Jun 01 Python
Python如何实现守护进程的方法示例
Feb 08 Python
Python 文件处理注意事项总结
Apr 10 Python
python入门教程 python入门神图一张
Mar 05 Python
python3使用SMTP发送HTML格式邮件
Jun 19 Python
Python实现把多维数组展开成DataFrame
Nov 30 Python
基于python求两个列表的并集.交集.差集
Feb 10 Python
django-csrf使用和禁用方式
Mar 13 Python
python实现最速下降法
Mar 24 Python
基于Python测试程序是否有错误
May 16 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
php xml-rpc远程调用
2008/12/19 PHP
PHP中数组定义的几种方法
2013/09/01 PHP
php使用环形链表解决约瑟夫问题完整示例
2018/08/07 PHP
PHP session垃圾回收机制实例分析
2019/06/28 PHP
类似框架的js代码
2006/11/09 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
checkbox选中与未选中判断示例
2014/08/04 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
jQuery实现获取绑定自定义事件元素的方法
2015/12/02 Javascript
js自定义trim函数实现删除两端空格功能
2018/02/09 Javascript
解决vue初始化项目时,一直卡在Project description上的问题
2019/10/31 Javascript
vue中配置scss全局变量的步骤
2020/12/28 Vue.js
Python去掉字符串中空格的方法
2014/03/11 Python
Python查找相似单词的方法
2015/03/05 Python
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
详解Python中break语句的用法
2015/05/14 Python
Python 私有函数的实例详解
2017/09/11 Python
Python编程实现粒子群算法(PSO)详解
2017/11/13 Python
对python添加模块路径的三种方法总结
2018/10/16 Python
django的auth认证,authenticate和装饰器功能详解
2019/07/25 Python
Django--权限Permissions的例子
2019/08/28 Python
推荐8款常用的Python GUI图形界面开发框架
2020/02/23 Python
python 对xml解析的示例
2021/02/27 Python
css3 flex实现div内容水平垂直居中的几种方法
2020/03/27 HTML / CSS
西班牙三叶草药房:Farmacias Trébol
2019/05/03 全球购物
几个数据库方面的面试题
2016/07/01 面试题
初中数学教学反思
2014/01/16 职场文书
大学总结自我鉴定
2014/01/18 职场文书
晚会邀请函范文
2014/01/24 职场文书
雷人标语集锦
2014/06/19 职场文书
小学阳光体育活动总结
2014/07/05 职场文书
先进工作者申报材料
2014/12/23 职场文书
晚会主持人开场白台词
2015/05/28 职场文书
初中语文教学随笔
2015/08/15 职场文书
读《皮囊》有感:理解是对他人的最大的善举
2019/11/14 职场文书
Window server 2012 R2 AD域的组策略相关设置
2022/04/28 Servers