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

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表格的资料请关注我们其它相关文章!

(0)

相关推荐

  • python读取excel数据绘制简单曲线图的完整步骤记录

    python读写excel文件有很多种方法: 用xlrd和xlwt进行excel读写 用openpyxl进行excel读写 用pandas进行excel读写 本文使用xlrd读取excel文件(xls,sxls格式),使用xlwt向excel写入数据 一.xlrd和xlwt的安装 安装很简单,windos+r调出运行窗口,输入cmd,进入命令行窗口,输入以下命令. 安装xlrd: pip install xlrd 安装xlwt: pip install xlwt xlrd的API(applica

  • 关于Python 解决Python3.9 pandas.read_excel(‘xxx.xlsx‘)报错的问题

    问题描述 使用pandas库的read_excel()方法读取外部excel文件报错, 截图如下 好像是缺少了什么方法的样子 问题分析 分析个啥, 水平有限, 直接面向stackoverflow编程 https://stackoverflow.com/questions/64264563/attributeerror-elementtree-object-has-no-attribute-getiterator-when-trying 我找到了下面的这几种说法 根据国外大神的指点, 我得出了这些

  • python 三种方法实现对Excel表格的读写

    1.使用xlrd模块读取数据 # 将excel表格内容导入到tables列表中 def import_excel(tab): # 创建一个空列表,存储Excel的数据 tables = [] for rown in range(1, tab.nrows): array = {'设备名称': '', '框': '', '槽': '', '端口': '', 'onuid': '', '认证密码': '', 'load': '', 'checkcode': ''} array['设备名称'] = ta

  • Python xlrd/xlwt 创建excel文件及常用操作

    一.创建excel代码 备注:封装好了(可直接调用) """ -*- coding:utf-8 -*- @Time :2020/8/20 21:02 @Author :Jarvis @File :jar_excel_util.py @Version:1.0 """ from typing import List import xlwt class JarExcelUtil: def __init__(self, header_list: List

  • Python 使用xlwt模块将多行多列数据循环写入excel文档的操作

    我就废话不多说了,大家还是直接看代码吧~ #!/usr/bin/python # -*- coding: utf-8 -*- import xlwt import re def host_regex(dataline): host_regex = r"<host>(.*?)</host>" host = re.findall(host_regex, dataline) if host: return host[0] def ip_regex(dataline):

  • 利用python汇总统计多张Excel

    为什么越来越多的非程序员白领都开始学习 Python ?他们可能并不是想要学习 Python 去爬取一些网站从而获得酷酷的成就感,而是工作中遇到好多数据分析处理的问题,用 Python 就可以简单高效地解决.本文就通过一个实际的例子来给大家展示一下 Python 是如何应用于实际工作中高效解决复杂问题的. 背景 小明就职于一家户外运动专营公司,他们公司旗下有好多个品牌,并且涉及到很多细分的行业.小明在这家公司任数据分析师,平时都是通过 Excel 来做数据分析的.今天老板丢给他一个任务:下班前筛

  • Python自动创建Excel并获取内容

    用到了两个库,xlrd和xlwt xlrd是读excel,xlwt是写excel的库[/code] 1)xlwd用到的方法: xlwt.Workbook()是创建了一个空文件对象 .add_sheet()为空文件对象,是在该文件中建立一个工作表,并返回工作表对象 .write(row,col,data)为工作表对象,表示在第row+1行第col列添加data数据 .save('文件名.xls')为空文件对象,最后保存. 2)xlrd用到的方法: 打开excel文件读取数据 data = xlrd

  • Python读写Excel文件的实例

    最近由于经常要用到Excel,需要根据Excel表格中的内容对一些apk进行处理,手动处理很麻烦,于是决定写脚本来处理.首先贴出网上找来的读写Excel的脚本. 1.读取Excel(需要安装xlrd): #-*- coding: utf8 -*- import xlrd fname = "reflect.xls" bk = xlrd.open_workbook(fname) shxrange = range(bk.nsheets) try: sh = bk.sheet_by_name(

  • python各种excel写入方式的速度对比

    经过实验,新建一个excel表格,该表格拥有7个sheet,每个sheet有800条数据,其中最后一个sheet为空. 首先使用openpyxl进行写入操作,代码如下: book = openpyxl.Workbook() auths = Auth.objects.filter(owner_id=1) filename = '导出数据' for auth in auths: sheet = book.create_sheet(auth.name, index = 0) sheet.append(

  • 利用python3筛选excel中特定的行(行值满足某个条件/行值属于某个集合)

    前言 做数据分析的时候通常我们并不是对真个excel文件进行操作,换言之,每一列都是一个特征,我们需要针对分析.遇到这类问题的时候,我们通常想得到一列中所有符合条件的数据,挑出来,然后组成一个单独的文件进行分析.比如一列中我们希望找到所有大于100的所有行,又比如 我们希望得到一列中包含某个特定字母的所有行,那么我们应该怎么办呢,这里就说一下. 在这之前我们先介绍一个pandas里面一个函数 loc() 英文解释是这样的:Purely label-location based indexer f

随机推荐