太离谱了 我觉得不bbbbbbbbbbbb上500字都对不起我的惨痛!!

从昨天下午拿到任务到今天早上!!! 我吐了!!!

这两星期打杂打的整个计算机学院的老底都要被我摸透了无语。。。

昨天接到的任务是:大概就是一届所有计院的学生的所有毕业设计的小分每个人都放在一个excel里面(也就是总共200+excel) 然后从每个excel里面取出各个单元格里的小分,汇总到一个excel里面。。。在这个汇总的excel里面已经有了学生的名字。。。

没有困难的工作。。只有勇敢的打工人(*  ̄︿ ̄)

一开始 我觉得不就是用python处理excel。。这还不简单????

最后我 TM。。。凸(艹皿艹 )

这数据问题有多大老师知道吗???她不知道!!她不知道!!!比如汇总的excel里面的名字有265个,但事实上她给我的表格只有250+个。。比如有些人名字在汇总的名单里叫ABC,但是。。。在表格的名字上就是ACB。。。这种错误看似小。。在代码上就很致命(微笑脸

言归正传。。

一开始我是想用glob获取文件夹中的所有文件名存在列表里 方便后面打开

import glob
files = glob.glob(r'../2/*.xlsx')

返回的是文件夹2里所有xlsx文件。。好了写着写着我发现了一个问题,就是不是所有的excel的文件的后缀名都是xlsx。还有些是xls,xlsm之类的。于是回炉重造一下。

#获取所有文件夹中的所有文件名
files = glob.glob(r'../2/*.*')

但是这样以后就会出现xls类型的文件是不适应我下文的代码的。。做到这一步我实在是没有耐心了,于是我手动把xls这几个文件给移出去了。(我就很离谱= =)

我先是想着从提取出来的文件名列表中用正则表达式把每个人的名字提取出来的。。但失败了。。囧。。我以为我正则表达式就还行了。。发现一对到那种各种特殊字符全加一起的就出问题。。就像下面这个一样,有缘我就再努力努力把某某某提取出来。。

../2\\某某某.xlsx

于是后来我选择了os某块里面的walk函数,也就是把文件夹下面的文件全走一遍,就提取出来最直接的那个文件名,比如某某某.xlsx。那这个提取名字还不简单吗。

#获取所有学生姓名
names = []
for root, dirs, file in os.walk('../2'):
    for item in file:
        pattern = re.compile('(.+).xl\w+')
        names.append(pattern.search(item).group(1))

然后我给每个指标建立了一个列表,一张一张打开excel从它里面的单元格里取出来

for file in files:
    f = load_workbook(file, data_only = True)
    #获取第一个表
    E = f.active
    t1 = E.cell(row=9, column=13).value
    t2 = E.cell(row=10, column=13).value
    t3 = E.cell(row=11, column=13).value
    t4 = E.cell(row=12, column=13).value
    t5 = E.cell(row=13, column=13).value
    t6 = E.cell(row=14, column=13).value
    a2_2.append(t1)
    a3_4.append(t2)
    a5_3.append(t3)
    a10_1.append(t4)
    a10_2.append(t5)
    a10_3.append(t6)

这看起来也太笨拙累赘了吧。。

于是后来我把一个一个加到列表这几句改成了如下句。。就先建立了一个字典。。

info_zip = {}
for i in range(len(files)):
    f = load_workbook(files[i], data_only = True)
    #获取第一个表
    E = f.active
    t1 = E.cell(row=9, column=13).value
    t2 = E.cell(row=10, column=13).value
    t3 = E.cell(row=11, column=13).value
    t4 = E.cell(row=12, column=13).value
    t5 = E.cell(row=13, column=13).value
    t6 = E.cell(row=14, column=13).value
    info_zip[names[i]] = [t1, t2, t3, t4, t5, t6]

因为那个excel里面各个毕业学生都是有顺序的嘛,所以我还得从那个汇总的excel里面取出来名字的列表

#读取数据
rb = xlrd.open_workbook(file_path)
table = rb.sheets()[0]
names_org = table.col_values(2)[1:]

因为表格里有的名字不一定跟文件里的名字对的上,所以得先判断过才能放进去。。就写进去的代码如下。。

for i in range(len(names)):
    stu_name = names_org[i]
    if stu_name in info_zip:
        for j in range(6):
            ws.write(i + 1, j + 5, info_zip[stu_name][j])

就离谱。。中间经历的各种坎坷我现在都有点忘了。。反正就整个过程就不平坦。还是怪我太vegetable。。继续努力努力。老师也别让我再继续去摸计院的底了好吗。。我不想再知道计院的任何了T T

遇到的问题:

一开始的时候我从excel里面取数据的时候,在load_workbook的函数里面是没加参数data_only这个参数的,所以当时取出来的是单元格里的那个公式。要加上data_only=True这个参数才可以取出来纯数据。

还有xlrd这个模块写入excel的时候xlsx文件是不兼容的,所以写进去以后这个文件就会打不开,最后是把xlsx文件改成xls文件才ok的。

(就过了一天遇到的问题就记得这两个了( ╯□╰ )

总的代码如下。。其实中间有很多改过了。。跟上面有一点点差距 就问题不大 应该。。

import xlwt
import xlrd
import os
import glob
from openpyxl import load_workbook
import re
import xlutils.copy

datas_path = "../2"
file_path = "../data/2.xls"

#读取数据
rb = xlrd.open_workbook(file_path)
table = rb.sheets()[0]
names = table.col_values(2)[1:]


#写入的表格
wb = xlutils.copy.copy(rb)
ws = wb.get_sheet(0)

#获取所有文件夹中的所有文件名
files = glob.glob(r'../2/*.*')

#给名字和文件名排序尽量使其顺序保持一致
files.sort()
names_sort = sorted(names)

# print(len(files))
# print(len(names))
# print(files)
# print(names)
info_zip = {}

j = 0
for i in range(len(files)):
    while(re.search(names_sort[j], files[i]) == None):
        j = j + 1
    f = load_workbook(files[i], data_only = True)
    #获取第一个表
    E = f.active
    t1 = E.cell(row=9, column=13).value
    t2 = E.cell(row=10, column=13).value
    t3 = E.cell(row=11, column=13).value
    t4 = E.cell(row=12, column=13).value
    t5 = E.cell(row=13, column=13).value
    t6 = E.cell(row=14, column=13).value
    info_zip[names_sort[j]] = [t1, t2, t3, t4, t5, t6]


for i in range(len(names)):
    stu_name = names[i]
    if stu_name in info_zip:
        for j in range(6):
            ws.write(i + 1, j + 5, info_zip[stu_name][j])

wb.save(file_path)

啊啊啊啊啊啊每天晚上都要早睡!!!每天早上都要  一觉~睡到自然醒过来!!!!!