飞道的博客

用python代码实现自动填写疫情报告表

518人阅读  评论(0)

寒假已经过了100多天了,对于学生党,每天除了网课,还有一个必须要面对的就是疫情报告表的上交,每天的活动轨迹都在家里,天天重复填写,尤其对于手表的班委来说,需要耗费很大的人力,所以我昨天早上在想能不能做一个用代码自动生成每天疫情表。

摸索了一整天,终于给摸索出来了。
自动生成每天的疫情表无非以下几点:

  • 修改表名称中的时间
  • 表中内容复制昨天一行并修改日期
  • 新表覆盖原表

按照上面的内容作为大致步骤,为大家介绍我是如何写的,我会分步骤贴上代码并解释,如果同学需要完整代码,可以到这里直接下载哦~

一、事前的准备


首先要把代码和同格式名称的表放在一个文件夹中

要看之前日期的单元格格式是否为日期,注意:我之前的格式是自定义,在这里要改过来

二、代码的编写

完成准备工作后,就要敲代码了
软件名称:spyder

(1)导入模块
import os #用于获取目录名
import xlrd #用于读取excel表
from xlutils.copy import copy # 复制原表格
from datetime import date #处理日期函数
(2)第二部分
root = "E:\Python_practice\疫情表\活动日志" #表格路径
dirs = os.listdir(root)    #列出路径下的所有表格
dirs = dirs[1:7] 
x = input('你想生成4月几日的疫情表:') #生成第几日的疫情表

代码解释:

dirs = dirs[1:7]  是因为我的文件目录下有7个文件:一个代码文件+6个表,所以要把第一行代码文件名去掉,这里可以根据你表的数量来修改数字7
(3)修改文件名称

这里我的表格名称格式为:“姓名+2020.3.24活动日志”
姓名可能是两个字或者三个字,但是日期和“活动日志”这些字符是不会变动的,所以可以利用列表反过来修改相应位置的字符

time = list(x)  #修改文件名字中的时间
dirs_name=[i for i in range(6)] #初始化列表
for i in range(6):
    dirs_name[i] = list(dirs[i])
    dirs_name[i][-10:-8] = time
    dirs_name[i] = "".join(dirs_name[i])

这里我是把要修改的时间以列表的形式来赋值,运行到这里dirs_name已经存好了新名字,dirs是原来的名字,

(4)对表格名称的处理

首先是借鉴了这位作者的博客,
→处理表格的参考博客←
因为预处理表格有关,需要安装一个包,打开cmd,输入这段代码即可下载

pip install xlutils

代码部分:

for m in range(6):
    """对excel进行操作"""
    work = xlrd.open_workbook(dirs[m])
    # 索引到第X个工作表
    sheet = work.sheet_by_index(0)
    #查看有多少行
    #print(sheet.nrows)
    #查看有多少列
    #print(sheet.ncols)
    #获取单元格内容
    #print(sheet.cell_value(5,1))

    a = list(i for i in range(6)) #初始化
    for i in range(6):
        a[i] = sheet.cell_value((sheet.nrows-3),i) #用变量a保存上一行数据
    
    """对excel进行修改/添加内容"""
    # 对数据表格进行复制
    old_content = copy(work)
    # 定位到Sheet1表
    ws = old_content.get_sheet(0)
    
    #在sheet1表中写入内容
    for i in range(6):
        ws.write(sheet.nrows,i,a[i]) # 将上一行数据复制到此行
    ws.write(sheet.nrows,0,'04/'+x) # 修改日期

    #对修改后的内容进行保存
    for i in range(sheet.nrows):
        if (sheet.cell(i,0).ctype == 3):
            date_value = xlrd.xldate_as_tuple(sheet.cell_value(i,0),work.datemode)
            time = date(*date_value[:3]).strftime('%m/%d')
            ws.write(i,0,time)
    #对修改后的内容进行保存
    old_content.save(dirs[m]) #注意要用原名称才能覆盖原表
    os.rename(dirs[m],dirs_name[m]) #最后重命名即可

以上就是全部过程啦

看一看效果↓
修改前的表格:

一键修改后的表:


写到这里了,坐等大佬来光顾我的评论区
也欢迎大家来一起交流学习


转载:https://blog.csdn.net/weixin_44403922/article/details/105693672
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场