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根据距离和时长计算配速示例
Feb 16 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
学习python的前途 python挣钱
Feb 27 Python
使用tensorflow实现矩阵分解方式
Feb 07 Python
Python安装依赖(包)模块方法详解
Feb 14 Python
解决python DataFrame 打印结果不换行问题
Apr 09 Python
解决python运行效率不高的问题
Jul 20 Python
Python使用xpath实现图片爬取
Sep 16 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 Python
python反扒机制的5种解决方法
Feb 06 Python
python 获取计算机的网卡信息
Feb 18 Python
Python Django搭建文件下载服务器的实现
May 10 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
德劲1103二次变频版的打磨
2021/03/02 无线电
php数据库连接时容易出错的特殊符号问题
2010/09/01 PHP
php中根据某年第几天计算出日期年月日的代码
2011/02/24 PHP
CentOS6.5 编译安装lnmp环境
2014/12/21 PHP
php制作基于xml的RSS订阅源功能示例
2017/02/08 PHP
PHP 返回数组后处理方法(开户成功后弹窗提示)
2017/07/03 PHP
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
js实现用户输入的小写字母自动转大写字母的方法
2017/01/21 Javascript
JS实现队列的先进先出功能示例
2017/05/10 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
实例详解BootStrap的动态模态框及静态模态框
2018/08/13 Javascript
vue-cli3全面配置详解
2018/11/14 Javascript
vue使用微信JS-SDK实现分享功能
2019/08/23 Javascript
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
Python实现新浪博客备份的方法
2016/04/27 Python
python3 面向对象__类的内置属性与方法的实例代码
2018/11/09 Python
python获取微信企业号打卡数据并生成windows计划任务
2019/04/30 Python
win10下python2和python3共存问题解决方法
2019/12/23 Python
Python semaphore evevt生产者消费者模型原理解析
2020/03/18 Python
Python 如何批量更新已安装的库
2020/05/26 Python
Python模块常用四种安装方式
2020/10/20 Python
Django URL参数Template反向解析
2020/11/24 Python
html5指南-5.使用web storage存储键值对的数据
2013/01/07 HTML / CSS
日期和时间问题
2015/01/04 面试题
大学生简单自荐信
2013/11/10 职场文书
动物科学专业毕业生的自我评价
2013/11/29 职场文书
村干部培训方案
2014/05/02 职场文书
师范类求职信
2014/06/21 职场文书
业绩倒数第一的检讨书
2014/09/24 职场文书
亲属关系公证书样本
2015/01/23 职场文书
工作简历自我评价
2015/03/11 职场文书
高三语文教学反思
2016/02/16 职场文书
Python获取指定日期是"星期几"的6种方法
2022/03/13 Python
vue实力踩坑之push当前页无效
2022/04/10 Vue.js