打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Python对excel的操作(作业)

一个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 xlrdimport xlwings as xwimport 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 xlrdimport xlwings as xwimport 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.nrowscol = 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 + 1app.quit()

结束,不知道为什么写完第三步这个推文有点抽风,

可能是我的问题但是它不会自动换行,格式还有问题

然后怎么打都奇怪,整无语了就不作过多注释了,

详细注释代码里也都附带了。

不建议复制进去跑一遍!!!

整整1312行学生数据点吃电脑性能

容易卡。我电脑运行也跑了二十多分钟

(所以说解析中的第三步应该是不需要的,

我写完这个才发现,

好像是不需要把成绩写入对应学院工作簿的)

但是最终效果是实现了,如下图:

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
VBA遍历文件夹下的文件并且合并工作簿到一个工作簿中
Excel SQL方法合并多个工作簿数据
利用Dir函数遍历某文件夹下的所有文件 | VBA实例教程
Python对excel的基本操作
[接口测试 - 基础篇] 07 来来来,一起读写excel玩玩之一
UC头条:[干货]建议收藏! ! 全网最完整的Python操作Excel数据封装函数
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服