本章介绍openpyxl的应用——把一个sheet拆分成多个sheet表。这里有个200行的杂乱无章的表,目标是把该表的每个班整理为一个sheet表。
使用openpyxl 处理这种问题,比较复杂。有一个思路就是:先把数据放入一个字典中,再按字典的不同键值对去存入不同的sheet表中。我们一步一步来,先获取每行的数据到一个列表中:
import openpyxl
file = openpyxl.load_workbook(r"D:\临时\python试验\openpyxl\把文件拆分成多个sheet表.xlsx")
sheet_fd = file['Sheet1'] # 选择工作表
for row in sheet_fd.iter_rows(2,sheet_fd.max_row,1,sheet_fd.max_column,values_only=True):
row_ls = [i for i in row] # 每行生成列表
print(row_ls)
然后将该列表的第1个元素作为字典的键,其他组成一个列表作为字典的值之一。
import openpyxl
file = openpyxl.load_workbook(r"D:\临时\python试验\openpyxl\把文件拆分成多个sheet表.xlsx")
sheet_fd = file['Sheet1']
d = {}
for row in sheet_fd.iter_rows(2,sheet_fd.max_row,1,sheet_fd.max_column,values_only=True):
row_ls = [i for i in row]
jian = row_ls[0] # 作为字典的键
zhi = row_ls[1:] # 除了第一个之外的元素组成列表作为字典的值
d[jian] = d.get(jian,[]) + [zhi] # !重点
print(d)
第10行 d.get(jian,[]) 的意思是再字典d中获取键jian,如果字典中存在键jian,那么就返回该键对应的值;如果字典中不存在键jian,那么就返回一个空列表。
d.get(jian,[]) + [zhi] 的意思是在返回的值中新增元素(列表zhi),注意zhi一定要加[],因为加上[]后此时[zhi]为 [['陈洁', 47, 49, 29, 5]],+号相当于extend,是把列表里的元素加进去,而不是把整个列表加进去。
import openpyxl
file = openpyxl.load_workbook(r"D:\临时\python试验\openpyxl\把文件拆分成多个sheet表.xlsx")
sheet_fd = file['Sheet1']
d = {}
for row in sheet_fd.iter_rows(2,sheet_fd.max_row,1,sheet_fd.max_column,values_only=True):
row_ls = [i for i in row]
jian = row_ls[0] # 作为字典的键
zhi = row_ls[1:] # 除了第一个之外的元素组成列表作为字典的值
d[jian] = d.get(jian,[]) + [zhi]
new_file = openpyxl.Workbook()
for key,value in d.items():
sheet = new_file.create_sheet(key) # 创建键对应的文件
sheet.append(['姓名','语文','数学','英语','综合科']) # 写入表头
for n_row in value:
sheet.append(n_row) # 写入数据行
new_file.remove(new_file['Sheet']) # 移除创建new_file时默认产生的Sheet
new_file.save(r"D:\临时\python试验\openpyxl\一表拆成多表.xlsx")
本文excel文件:链接:https://pan.baidu.com/s/1RkLCCXuWfPz6rYcnuUJrrw?pwd=z3u1
提取码:z3u1