代码杂记[壹]-将多个Excel信息汇总到一个Excel表格里

从今天开始,我打算开展一个小小的计划,就是每次在写代码的时候都把写代码的原因、经过和结果记录下来。这主要有几个作用:一则是激励自己有事没事多写写代码,避免业务能力生疏了,二则是将所学用于实践,不让“学习编程”停留于课堂,三则是每次写代码,尤其是调用新的包/函数,或完成新的任务时都会遇到些许困难,要查很多资料才能解决,于是我想把困难(bug),产生原因和解决方法记录下来,或许其他人可以得到帮助,也提醒自己之后遇到相似的问题可以有对应解决的方法。

‘壹’——将多个Excel信息汇总到一个Excel表格里

0.代码目的

工作和学习中,我们总会收集统计一些人的相同信息,比如疫情期间,某位员工春节期间是否有跨省移动,以及相应时间和路径;又如学生返校的时间、方式、联系方式等。这些工作共同的特点是,我们会下发一个Excel文件,然后很多人都填同一个表格(如下图[汇总表格.xlsx]),但是我们最终又要把每个人的表格汇总到一个大表格里变成集成在一起的一条条信息。
表格样式举例

这个过程的传统操作方法就是,找一个人打开每个人的Excel把对应信息复制粘贴到大的汇总表里。当人数较多时,这个操作就要重复很多次,效率很低。而这种简单重复性工作,完全可以用计算机来实现。同时我们还需要统计,谁提交了信息,谁没提交,如果人工统计很耗时费力。本代码就是为了解决这项工作。

1.代码实现

我们应用openpyxl来处理Excel文件,用os来对电脑中的文件进行操作。包的详细介绍和安装方法可以参考其他文章,在此只针对解决此问题进行记录。
在这之前我们需要把所有需要被统计的人员名单复制粘贴到汇总表格里面(在我的例子中,粘贴到从第三行开始的第二列),方便统计谁还没有提交。

## 打开要汇总的表格
from openpyxl import load_workbook #准备读写Excel的包
wb = load_workbook('汇总表格.xlsx')#要汇总的表格
ws = wb['在校学生']#load汇总表格的那个Sheet,在我的文件中叫‘在校学生’,也可以在这个地方按顺序选取第一个sheet,ws=wb[0]
#print(ws.cell(2,3).value)这行代码的意思是输出wb表格的ws这个sheet的第二行第三列的数据的值,可以check前面的操作是否成功

##打开收集的员工/学生提交的每一个文件并把其中的数据粘贴都汇总表格里
import os#准备操作电脑文件的包
for filename in os.listdir('/Users/MEGAN/Desktop/所有数据'):#对路径中的每一个文件操作,循环得到这个文件夹下每一个文件的名字
    if filename == '.DS_Store':#①这里后面解释
        continue
    directory = './Desktop/所有数据/'#来源文件的文件夹路径
    file = filename#要打开的文件名
    file_to_find=directory+file#整个文件的文件名
    ##这里打开每一个文件
    tem_wb = load_workbook(file_to_find)#打开这个文件
    tem_ws = tem_wb['在校学生']#选定这个文件的第一个sheet
    tem_name = tem_ws.cell(3,2).value#存这个文件的人名
    plus = 0#②后面解释
    if tem_name == None:
        tem_name=tem_ws.cell(4,4).value
        plus = 1
    #print(tem_name) 这行可有可无,有就是输出一下已经操作过谁的文件了
    ##这里开始复制粘贴工作
    for i in range(30):#30是所有需要统计的人数总数
        row = i+3
        if ws.cell(row,2).value == tem_name:#粘贴到这个人名对应的那一行
            for col in range(2,14):#从第2-13列数据都粘贴过去
                ws.cell(row,col,value=tem_ws.cell(3+plus,col).value)
            break
     
##都操作结束后记得保存
wb.save('汇总表格.xlsx')

基本方法介绍完毕,后续解释可能会遇到的问题及解决方法

2.报错 FileNotFoundError和查找文件所在路径

首先,注意直接文件名方式load的文件必需要在和此python文件在一个文件夹的文件,通常在根文件夹。os.getcwd()函数可返回当前文件夹
其次,如果要找其他文件夹的文件就必须在文件名前面加路径。找文件路径的方法,MacBook可以通过Ctrl/Command + I,或者打开文件夹后文件显示简介,有可能得到的是中文路径,只需复制中文路径再粘贴到“文本编辑”里即可获得英文路径。复制粘贴到代码中即可。查看文件路径方法
最后, FileNotFoundError出现的主要原因就是,1文件名抄错了,2文件夹路径设置出错。注意,各级文件夹之间需要有/,文件夹和文件名之间也需要有/。
注,这里只介绍实现目的的个人认为最直接简单的方法,其他方法的参考链接我会备注在引用中,可参考。

https://www.zhihu.com/question/22883229

3.openpyxl报错UserWarning: Call to deprecated function

用了比较古老的函数,比如ws=wb.get_sheet_by_name(“在校学生”)。有可能也能实现但是会报错,建议换为比较简单直接的新鲜函数,即第一部分中介绍的,用名称或编号直接索引。

参考:https://blog.csdn.net/captain811/article/details/79648005

4.openpyxl报错InvalidFileException(一)

第一部分代码①部分的解释:
报错内容大概是openpyxl does not support file format, please check you can open it with excel,后面还会列举这个包支持的excel文件格式后缀。
最开始看到可能是很困惑的,文件夹里明明都是符合要求的excel文件为什么还会报错。其实是MacBook自动生成了一个/些隐藏文件,在循环文件夹中所有文件的时候也会处理那些隐藏文件,导致出问题,程序不能正常运行。
如果输出文件夹中所有文件的名字,会看到一个叫“.DS_Store”的文件。他也参与了循环,但是他不能被这个包处理,也不应该被处理,所以我们应该在循环中,如果遇到他就跳过循环中后续操作(continue),就可以解决这个问题了。
如果电脑中没有“.DS_Store”文件依然出现了这个报错,那可能是引用文件名的时候出现了一些问题,比如错误地写成了Excel工作名字。

关于“.DS_Store"的其他文章 https://www.jianshu.com/p/46f22a29b78d

5.openpyxl报错InvalidFileException(二)

遇到类似的报错我习惯性先输出文件夹中所有文件的名字,看有没有奇怪的东西出现。
有一次报错时我发现了一个文件的名字前面带有"~$",这是office文件的缓存文档,原因是我打开了这个文件夹中的某一个文件没有关闭,在代码处理这个文件夹中每一个文件的时候就会遇到问题。解决方法就是关闭打开的这个word/excel,这个"~$"开头的缓存文档会自然消失,bug就解决了。

6. 有的时候明明有某个人的文件,却没有复制到汇总文件中过去

第一部分代码②部分的解释:
有些人填表习惯很独特,不直接填在标题下第一行(可能会在第二行或第三行),所以我们直接去标题下第一行找他的数据,就找不到,于是我们需要检测一下这一行是否有数据,没有就找下一行,这样问题就解决了,第二部分代码正是这个用处。如果数据量大有的人会填在其他位置的话,也可以些更复杂点的循环来解决。第一部分的代码就是假设,大家要不然填在Excel的第三行(标题下第一行),要不然就填在第四行,不会有其他的了。

写在[壹]最后

  1. 希望还有[贰]
  2. 希望[贰]在不久后
  3. 希望写[贰]的时候可以有多几张图/截图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值