Python自动化:30行代码从Excel提取个人值班表

青禾
青禾
发布时间:2026-10-12 | 4人浏览过
原创

本文介绍如何使用Python的openpyxl库,通过不到30行代码实现从Excel文件中自动提取个人值班信息。文章详细讲解了安装模块、读取筛选数据以及生成新表格的具体步骤,并提供完整代码与执行结果,帮助读者快速掌握Excel自动化处理技巧。

一、核心模块与准备工作

在Python中处理Excel文件有多种方式。早期的方案通常组合使用 xlrd(读取)、xlwt(写入)和 xlutils(转换),或者直接使用功能更全面的 pandas。然而,对于需要直接读写Excel文件且保持格式的场景,openpyxl 是一个轻量且高效的选择。它支持对Excel文件进行直接的读写操作,无需依赖其他转换模块。

在开始编写代码前,首先需要安装 openpyxl 模块。在终端或命令行中执行以下命令即可完成安装:

pip install openpyxl

二、读取并筛选值班信息

提取个人值班表的核心逻辑在于遍历Excel工作表,识别包含目标人员姓名的行,并提取关键信息(如值班日期)。具体操作步骤如下:

  1. 加载工作簿:使用 openpyxl.load_workbook 加载Excel文件,设置 data_only=True 以获取公式计算后的值。
  2. 定位数据区域:通过 get_sheet_by_name 获取名为“日常加班”的工作表。
  3. 构建空行标识:生成一个由 None 填充的字符串,用于判断当前行是否为空行。
  4. 遍历数据行:循环读取每一行的数据,将其拼接为字符串。若字符串中包含目标姓名(如“***”),则提取该行的日期和姓名信息。
  5. 终止条件:当检测到空行标识时,直接跳出循环,避免无效读取。

实现该逻辑的代码如下:

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

三、创建个人值班信息表

筛选出目标数据后,需要将其保存到一个新的Excel文件中。操作步骤包括:

  1. 创建工作簿:使用 openpyxl.Workbook() 创建一个新的Excel文件。
  2. 获取活动工作表:通过 book.active 获取默认的工作表。
  3. 写入数据:遍历筛选出的值班信息列表,将姓名和日期分别写入新表格的第一列和第二列。
  4. 保存文件:调用 book.save() 将结果保存为 my_duty.xlsx。

实现代码如下:

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')

四、完整代码与执行结果

将上述逻辑整合,并添加时间统计功能,完整的Python代码如下:

#!/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')

执行上述代码后,程序将自动读取 duty.xlsx 文件,提取包含目标姓名的值班信息,并生成 my_duty.xlsx 文件。执行结果如下图所示:

五、总结与展望

通过本文的介绍,我们掌握了使用 openpyxl 模块进行Excel文件读写的基本方法。该方案不仅代码简洁,而且执行效率高,非常适合处理日常办公中的表格自动化任务。未来,可以在此基础上进一步扩展,例如根据提取的值班时间,自动发送微信提醒,从而实现更完整的办公自动化流程。

以上就是Python自动化从Excel提取个人值班表的详细内容,更多关于Python办公自动化的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表