一个python选修作业,囊括了python对excel处理的库的使用方法,就想拉出来写一下。
题目:
编写程序,对“复试名单.xlsx”素材文件完成以下操作:
1、按素材文件中的学院名称为每个学院单独创建文件夹。
2、将素材文件中的数据按学院拆分为多个工作簿文件,以学院名称命名中的工作表也以学院名称命名),并放在1中创建的对应文件夹中。
(读之前必须知道的点:一个工作簿中可以有多个工作表,例如:马克思主义学院.xlsx这个工作簿中有sheet1,sheet2,sheet3等多个工作表)
要求:
1、每行代码都要有注释进行说明
2、只提交python程序源文件(.py)
素材文件(部分):
共计1312行,1311个学生数据,21个学院
解析:
1、首先需要创建对应学院名称的文件夹,这个比较方便,只需要从这个素材表格中获取总的学院列表,然后用os库中的os.mkdir创建以学院名称命名的文件夹。
2、然后需要创建以学院名称命名的工作簿(.xlsx),也是用从素材文件中获取的学院列表,用xlwings库创建xlsx工作簿,存放路径为第一步创建的对应学院的文件夹中,例如:'马克思主义学院’文件夹中应该有'马克思主义学院.xlsx’工作簿。
3、第三步我不确定是不是需要,因为题目没有细说,我就当他要,就是将 ’复试名单.xlsx'中每个学生的数据放入第二部创建的对应学院的工作簿中,例如:素材文件中第二行的数据为马克思主义学院的学生的数据,则将整行数据放入’马克思主义学院'文件夹中的’马克思主义学院.xlsx'中去。
运行效果视频:
操作:
1.调用使用的库:
import xlrd
import xlwings as xw
import os
其中xlrd和xlwings都是对excel操作的,os是针对创建文件夹操作的。
2.获取’复试名单.xlsx'中的学院名称列表
2.1 先用xlrd库打开’复试名单.xlsx'文件
test = xlrd.open_workbook('复试名单.xlsx')
2.2 打开'复试名单.xlsx'中的第一个工作表,创建对象sheet
sheet = test.sheet_by_index(0) # 0代表第一个工作表
2.3 获取'复试名单.xlsx'中第一个工作表的第五列的数据(第五列对应的数据就是每个学生的学院)
college_list = sheet.col_values(4) # 4代表第五列
获取第五列的所有数据并存入college_list列表内,列表内的每一项都为string类型,college_list长度即为1311(所有学生的学院,所以是有重复项的)
2.4 对college_list 学院名单列表进行去重处理(去除列表中重复部分,即每个学院仅保留一项)
college_list = list(set(college_list)) # 去重后的列表存储进college_list中去
2.5 去除列表中’学院'这个数据项,因为2.3中获取第五列的数据包括了第五列第一行的索引“学院”这个数据,这是无用的需要去除。
college_list.remove('学院')
此时的college_list 就是全部21个学院的学院列表,列表中每一项都为string类型。
3.创建对应学院的文件夹
3.1 用for循环遍历 college_list 学院名称列表
for i in range(0, len(college_list)):
os.mkdir(college_list[i])
以college_list[i]这个字符串为名字命名创建文件夹,由于for循环遍历,所以可以创建21个以不同学院名称命名的文件夹。
3.2 在对应学院文件夹内创建对应xlsx工作簿,例:在马克思主义学院文件夹中创建马克思主义学院.xlsx工作簿
app = xw.App(visible=True, add_book=False)
for i in range(0, len(college_list)):
xl_book = app.books.add()
xl_book.save(os.getcwd() + f'\\{college_list[i]}\\{college_list[i]}.xlsx')
创建app对象用来创建对应续学院的xlsx文件
app = xw.App(visible=True, add_book=False)
for循环遍历学院名称用于后续工作簿命名
xl_book.save(FilePath) 即为保存文件到FilePath路径
文件不存在时则为创建。
4.将对应学院的工作簿中的工作表名称修改为学院名称
for i in range(0, len(college_list)):
# 打开工作簿(遍历学院名称)
work_book = app.books.open(os.getcwd() + f'\\{college_list[i]}\\{college_list[i]}.xlsx' )
for j in work_book.sheets:
j.name = j.name.replace(sheet_app.name, college_list[i] #将工作簿中的工作表名称(sheet_app.name)更换为学院名(college_list[i])
work_book.save() #保存当前打开的工作簿
work_book.close() #关闭
5.将复试名单.xlsx中的第一行的索引写入每一个学院对应工作簿
(即第一行的学院、姓名、专业等索引)
# 第一行的内容(列表)
row_first = sheet.row_values(0)
# 用for循环对每个学院的xlsx文件填入第一行索引
for i in range(0, len(college_list)):
# 确认写入表格路径,即为对应学院文件夹的对应工作簿
write_xls = app.books.open(os.getcwd() + f'\\{college_list[i]}\\{college_list[i]}.xlsx')
for j in range(0, sheet.ncols):
write_xlsx(1, 1, j, row_first[j])
6. 遍历1312个学生数据,将其写入对应学院的工作簿中去
# 用学院名称遍历,归类同学院的数据
for i in range(0, len(college_list)):
# 学生在对应学院工作簿中应该写入的行数
write_row = 2
# 遍历 复试名单 中的学生数据
for j in range(1, row):
# 如果遍历到的学生的学院名称与当前正在归类的学院名称相同
if sheet.row_values(j)[4] == college_list[i]:
# 获取当前遍历到的学生的所有数据(行)
row_write = sheet.row_values(j)
# 打开正在归纳的学院的数据工作簿
write_xls = app.books.open(os.getcwd() + f'\\{college_list[i]}\\{college_list[i]}.xlsx')
# 遍历列输入数据(row_write列表的长度一个个输入)
for x in range(0, col):
# 调用写入函数写入学生数据
write_xlsx(1, write_row, x, row_write[x])
# 学生在对应学院工作簿的行数+1,在进行下一个输入时不会冲突替换
write_row = write_row + 1
7.最后切记关闭app对象
app.quit()
My Code:
import xlrd
import xlwings as xw
import os
def write_xlsx(page, hang, lie, word):
'''
函数用于将数据写入xlsx工作簿中
:param page: 写入工作簿的页数(即为第几个工作表)
:param hang: 行
:param lie: 列
:param word: 写入的数据
:return: 无
'''
# 写入
write_xls.sheets[page - 1][hang - 1, lie - 1].value = word
# 保存
write_xls.save()
# 打开xlsx文件
test = xlrd.open_workbook('复试名单.xlsx')
# 打开’ 复试名单.xlsx '中的第一个工作表
sheet = test.sheet_by_index(0)
# 获取' 复试名单.xlsx ' 中第一个工作表的第五列(即学院数据列),存入college_list列表中
college_list = sheet.col_values(4)
# 对college_list 学院名单列表进行去重处理
college_list = list(set(college_list))
# 去除college_list列表中的元素为”学院”的数据,去除索引
college_list.remove('学院')
# 获取 复试名单 中数据的总行数、总列数
row = sheet.nrows
col = sheet.ncols
# 创建app对象用来创建对应续学院的xlsx文件
app = xw.App(visible=True, add_book=False)
# for循环遍历college_list列表,用os.mkdir完成对各个学院文件夹的创建,用xlwings库中save创建对应xlsx文件,并修改工作表名称为学院名称
for i in range(0, len(college_list)):
# 创建文件夹
os.mkdir(college_list[i])
xl_book = app.books.add()
# 保存地址为当前项目地址( os.getcwd() +\\ 学院文件夹 \\ + 学院名.xlsx)
xl_book.save(os.getcwd() + f'\\{college_list[i]}\\{college_list[i]}.xlsx')
# 根据学院名称地址打开对应学院的表格xlsx
work_book = app.books.open(os.getcwd() + f'\\{college_list[i]}\\{college_list[i]}.xlsx')
# 开始处理工作表
sheet_app = work_book.sheets[0]
# 遍历工作表
for j in work_book.sheets:
# 将 sheet1 工作表 替换为 学院名称 工作表
j.name = j.name.replace(sheet_app.name, college_list[i])
# 保存工作表
work_book.save()
# 退出工作表
work_book.close()
# 第一行的内容(列表)
row_first = sheet.row_values(0)
# 用for循环对每个学院的xlsx文件填入第一行索引
for i in range(0, len(college_list)):
# 确认写入表格路径,即为对应学院文件夹的对应工作簿
write_xls = app.books.open(os.getcwd() + f'\\{college_list[i]}\\{college_list[i]}.xlsx')
for j in range(0, sheet.ncols):
write_xlsx(1, 1, j, row_first[j])
# 用学院名称遍历,归类同学院的数据
for i in range(0, len(college_list)):
# 学生在对应学院工作簿中应该写入的行数
write_row = 2
# 遍历 复试名单 中的学生数据
for j in range(1, row):
# 如果遍历到的学生的学院名称与当前正在归类的学院名称相同
if sheet.row_values(j)[4] == college_list[i]:
# 获取当前遍历到的学生的所有数据(行)
row_write = sheet.row_values(j)
# 打开正在归纳的学院的数据工作簿
write_xls = app.books.open(os.getcwd() + f'\\{college_list[i]}\\{college_list[i]}.xlsx')
# 遍历列输入数据(row_write列表的长度一个个输入)
for x in range(0, col):
# 调用写入函数写入学生数据
write_xlsx(1, write_row, x, row_write[x])
# 学生在对应学院工作簿的行数+1,在进行下一个输入时不会冲突替换
write_row = write_row + 1
app.quit()
结束,不知道为什么写完第三步这个推文有点抽风,
可能是我的问题但是它不会自动换行,格式还有问题
然后怎么打都奇怪,整无语了就不作过多注释了,
详细注释代码里也都附带了。
不建议复制进去跑一遍!!!,
整整1312行学生数据有点吃电脑性能
容易卡。我电脑运行也跑了二十多分钟
(所以说解析中的第三步应该是不需要的,
我写完这个才发现,
好像是不需要把成绩写入对应学院工作簿的)
但是最终效果是实现了,如下图:
联系客服