脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服务器之家 - 脚本之家 - Python - Python还能这么玩之只用30行代码从excel提取个人值班表

Python还能这么玩之只用30行代码从excel提取个人值班表

2021-11-23 11:25Rattenking Python

公司实行项目值班制度,拿到值班表,看到全部的值班信息,要去查找自己的值班信息,是一件头痛的事情.作为程序员,当然要简化,将自己的信息提炼出来,需要的朋友可以参考下

一、查找操作

1.excel 模块 xlrd,xlwt,xlutils 分别负责 excel 文件的读、写、读写转换工作!

2.openpyxl 直接可以对 excel 文件读写!

3.pandas 直接可以对 excel 文件读写!

二、安装 openpyxl 模块

?
1
pip install openpyxl

三、读取并筛选值班表中自己的信息

1.读取所有的值班信息;

2.由于一般情况 excel 都会有部分表格为空,保存全部 none 的 excel 行字符串数据;

3.循环全部的值班数据,将当前行数据形成一个数据字符串;

4.判断当前值班信息字符串是否含有自己的姓名;

5.对含有自己信息的数据中关键信息(值班时间,姓名)进行存储;

6.然后判断当前字符串是否含有全部 none 的数据;

7.由于值班表没有空出的行,所以查到 none,直接跳出循环。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
dutys = []
  book = openpyxl.load_workbook('duty.xlsx',data_only=true)
  sheet = book.active
  all_data = book.get_sheet_by_name("日常加班")
  none_str = ''.join([str(none).ljust(20) for c in range(1,all_data.max_column+1)])
  for r in range(1,all_data.max_row + 1):
    cur_str = ''.join([str(all_data.cell(row=r,column=c).value).ljust(20) for c in range(1,all_data.max_column+1)])
    if cur_str.find("***") >= 0:
      dutys.append({
        "date": all_data.cell(row=r,column=2).value,
        "name": all_data.cell(row=r,column=3).value
      })
    elif cur_str.find(none_str) >= 0:
      break
  return dutys

四、创建自己的值班信息表

1.创建一个值班信息表的 excel;

2.将自己的值班信息循环;

3.将信息填入创建的表格。

?
1
2
3
4
5
6
book = openpyxl.workbook()
 sheet = book.active
 for i in range(len(dutys)):
   sheet.cell(row=1 + i, column=1).value = dutys[i].get("name")
   sheet.cell(row=1 + i, column=2).value = f'{dutys[i].get("date")}'
 book.save('my_duty.xlsx')

五、全部代码

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env python
"""
@author  :rattenking
@date    :2021/06/02 10:19
@csdn    :https://blog.csdn.net/m0_38082783
"""
 
import openpyxl
import time
 
def get_my_duty_date():
  dutys = []
  book = openpyxl.load_workbook('duty.xlsx',data_only=true)
  sheet = book.active
  all_data = book.get_sheet_by_name("日常加班")
  none_str = ''.join([str(none).ljust(20) for c in range(1,all_data.max_column+1)])
  for r in range(1,all_data.max_row + 1):
    cur_str = ''.join([str(all_data.cell(row=r,column=c).value).ljust(20) for c in range(1,all_data.max_column+1)])
    if cur_str.find("***") >= 0:
      dutys.append({
        "date": all_data.cell(row=r,column=2).value,
        "name": all_data.cell(row=r,column=3).value
      })
    elif cur_str.find(none_str) >= 0:
      break
  return dutys
 
def create_my_duty_list(dutys):
  book = openpyxl.workbook()
  sheet = book.active
  for i in range(len(dutys)):
    sheet.cell(row=1 + i, column=1).value = dutys[i].get("name")
    sheet.cell(row=1 + i, column=2).value = f'{dutys[i].get("date")}'
  book.save('my_duty.xlsx')
 
if __name__ == "__main__":
  start_time = int(round(time.time() * 1000))
  dutys = get_my_duty_date()
  create_my_duty_list(dutys)
  end_time = int(round(time.time() * 1000))
  print(f'本次提取值班表时间:{end_time - start_time}ms')

六、执行结果

Python还能这么玩之只用30行代码从excel提取个人值班表

七、总结

熟悉 openpyxl 模块的各个功能,方便对 excel 的操作;筛选提取自己关注的关键信息,重新建表;下一篇根据值班时间,用 python 自动给自己的微信发送信息,进行提示!

到此这篇关于python还能这么玩之只用30行代码从excel提取个人值班表的文章就介绍到这了,更多相关python从excel提取个人值班表内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_38082783/article/details/117463183

延伸 · 阅读

精彩推荐