最近一位当老师的朋友说能不能整个学生座位表的软件,每次手动排太烦了,于是他说了需求:
1.男生和男生坐在一起,女生和女生坐在一起,成绩好坏随机排
2.总共九列七排,(其实规定9列之后排数不重要,依次往后续上就可以了)
基于这两个要求还是很好实现的,就随手给他整了一个,主要还是用的xlwt和xlrd这两个库来处理xls表格,感觉写的匆忙,很多优化的方便都没来得及处理,欢迎大家随时指正,下面展示一下代码片部分,供参考
filepath=os.path.abspath(os.curdir) #获取当前文件的目录
def readfile(file):
work_book = xlrd.open_workbook(file) #打开工作表(学生信息表)
sheet_1 = work_book.sheets()[0] #打开表格1
# print(sheet_1)
col_num = int(sheet_1.ncols) #获取学生表的列数和行数
row_num = int(sheet_1.nrows)
name_list_m = [] #男生姓名列表
name_list_w = [] #女生姓名列表
# sex=sheet_1.cell_value(1,1)
# print(sex)
#注意此处默认文件第一行为属性值:姓名,性别等等
for i in range(row_num):
if i == 0:
continue
sex = sheet_1.cell_value(i, 1) #这里因为表格固定第二列为性别,所以讲列数写死
name = sheet_1.cell_value(i, 0) #获取当前学生姓名
if sex == 0: #如果性别男,则放入一组等待排序,0表示男性,1表示女性
name_list_m.append(name)
else: #女生放入一组等待排序
name_list_w.append(name)
lenm = len(name_list_m) #男生总人数
lenw = len(name_list_w) #女生总人数
上面的片段即实现了将表格男女生分开,放入列表中,下面就是讲男女生分组了,三人一小组,每一排三个小组
new_m = [] #先新建两个列表,代表参与分组的学生
new_w = []
for i in range(int(lenm / 3)): #对男生进行分配,每三人一组
a = random.sample(name_list_m, 3) # 这里是对男生列表进行随机不重复取3个值,并放入新的列表中
new_m.append(a) #将参与分组的学生移除之前的列表,这样剩下的学生就是未能参与分组的
for j in range(len(a)):
name_list_m.remove(a[j])
for i in range(int(lenw / 3)):
a = random.sample(name_list_w, 3)
new_w.append(a)
for j in range(len(a)):
name_list_w.remove(a[j])
alllist = new_w + new_m #男女生总的分组列表合在一起
至此第一部分结束,将男女生分组 分别已经随机排序,下面将男女组随机排列写入新的表格中
f = xlwt.Workbook()
sheet_2 = f.add_sheet("座位表0", cell_overwrite_ok=False)#新建座位表
#sheet_3 = f.add_sheet("座位表", cell_overwrite_ok=False)
# 这里对之前男女生列表进行随机排列并加入新列表里
lenall = len(alllist)
new_all = []
for i in range(lenall):
list0 = random.sample(alllist, 1) #在总的分组中随机取出一组加入新列表,同时在原列表中移除
new_all.append(list0[0])
alllist.remove(list0[0])
print(new_all) #新的随机分组
list_name = [] #这里将分组完毕的学生全都依次排列
for i in range(lenall): #获取分组总长度
for j in range(len(new_all[i])): #获取分组中每一个小的分组长度
list_name.append(new_all[i][j]) #取出每一个对应的学生名
print(len(list_name)) #参与分组总人数
# 将之前未能拼成三人一组的学生加入列表
if name_list_w==[]:
pass
else:
for i in range(len(name_list_w)):
list_name.append(name_list_w[i])
if name_list_m==[]:
pass
else:
for i in range(len(name_list_m)):
list_name.append(name_list_m[i])
最后将数据写入表格:
it = iter(list_name) #这里用了生成器函数,用next()一次取出每一个值
len0 = len(list_name)
while True:
try:
for i in range(int(len0 / 9 + 1)):
for j in range(9):
sheet_2.write(i, j, next(it))
# sheet_3.write(i, j, next(it))
except StopIteration:
break
f.save(file)
之后看一下运行效果和实践效果,代码已打包