(四十一)使用列表推导式对多行数据求和
# 导入openpyxl模块
import openpyxl
# 根据“收入表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("收入表.xlsx", data_only=True)
mysheet = mybook.worksheets[0]
#设置收入表(mysheet)的数据范围(myrange)
myrange=mysheet['A1':'D8']
#使用列表推导式对myrange的行数据求和
myvalues=[sum([mycell.value for mycell in myrow[1:]]) for myrow in myrange[4:]]
myrowindex=5
for myvalue in myvalues:
#在合计列的单元格中写入求和数据(即每个季度的收入合计)
mysheet.cell(myrowindex,5).value=myvalue
myrowindex+=1
# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mybook.save("结果表-收入表.xlsx")
myvalues=[sum([mycell.value for mycell in myrow[1:]]) for myrow in myrange[4:]]
是一个列表推导式;
for myrow in myrange[4:] 表示从数据范围 (myrange) 的第5行开始循环每一个行(myrow);
for mycell in myrow[1:] 表示从该行(myrow)的第二列开始循环每个单元格(mycell);sum([mycell.value for mycell in myrow[1:]]) 表示累加该行每个单元格(排除第一个)的数据
(四十二)使用插入行方法制作工资条
# 导入openpyxl模块
import openpyxl
# 根据“工资表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("工资表.xlsx", data_only=True)
mysheet = mybook['工资表']
# 采用倒循环方式循环每行,mysheet.max_row表示最后一行,2表示终止行是第2行(只能到1,由于从0计数,故1是第二行)
for myrow in range(mysheet.max_row, 2, -1):
# 添加空白行,以便于为每位员工的工资条添加表头
mysheet.insert_rows(myrow)
for mycol in range(1, 8):
# 在空白行中写入表头,myrow和mycol分别表示行号和列号
mysheet.cell(myrow, mycol, mysheet.cell(1, mycol).value)
# 添加空白行,以便于裁剪工资条
mysheet.insert_rows(myrow)
# 保存工作簿,保存为"结果表-工资表.xlsx"文件
mybook.save("结果表-工资表.xlsx")
for myrow in range(mysheet.max_row, 2, -1)
表示采用倒循环方式(步长是-1)循环每行,mysheet.max_row表示最后一行,2表示终止行是第2行,由于每次执行插入行操作mysheet.insert_rows(myrow) 都会发生变化,因此采用倒循环方式。
mysheet.cell(myrow, mycol, mysheet.cell(1, mycol).value)
表示为每位员工的工资条添加表头,外层的mysheet.cell() 方法用于向空白行的指定单元格写入表头数据,内层的mysheet.cell() 方法用于读取第一行表头的指定单元格的数据
(四十三)在指定位置连续删除多行数据
# 导入openpyxl模块
import openpyxl
# 根据“收入表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("收入表.xlsx", data_only=True)
mysheet = mybook.active
# 从收入表(mysheet)第6行开始,连续删除两行数据
mysheet.delete_rows(6, 2)
# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mybook.save("结果表-收入表.xlsx")
mysheet.delete_rows(6, 2)
表示从收入表(mysheet)的第6行开始,连续删除两行数据数据,delete_rows()方法的第一个参数表示删除的起始位置(会删除此行),第二个参数表示删除的行数
(四十四)使用集合随机删除一行数据
# 导入openpyxl模块
import openpyxl
# 根据“成绩表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("成绩表.xlsx", data_only=True)
mysheet = mybook.active
# 根据成绩表(mysheet)的单元格数据(第一行除外)创建集合(mtset)
myset=set(list(mysheet.values[1:]))
#从集合(myset)中随机删除一个成员(此例为行)
myset.pop()
#删除成绩表(mysheet)的行(第一行除外)
while mysheet.max_row>1:
mysheet.delete_rows(2)
#根据随机删除成员(行)之后的集合(myset)重新添加成绩表(mysheet)的数据
for myrow in mysheet:
mysheet.append(myrow)
# 保存工作簿,保存为"结果表-成绩表.xlsx"文件
mybook.save("结果表-成绩表.xlsx")
myset.pop()
表示从集合中随机移出一个成员(每次结果可能都不相同)
(四十五)根据指定条件删除多行数据
# 导入openpyxl模块
import openpyxl
# 根据“成绩表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("成绩表.xlsx", data_only=True)
mysheet = mybook.active
# 由于每执行一次mysheet.delete_rows(myrow)
# mysheet.max_row会发生变化,因此采用倒循环
# mysheet.max_row表示起始行号,1表示结束行号,-1表示步长(即倒循环)
for myrow in range(mysheet.max_row, 1, -1):#取不到1,取到0
# print(mysheet.max_row)
# 对每行的B,C,D,E,F列求和
myrowsum = sum([mycell.value for mycell in mysheet[myrow][1:6]])
# 如果合计小于400,则删除行
if myrowsum < 400:
mysheet.delete_rows(myrow)
# 保存工作簿,保存为"结果表-成绩表.xlsx"文件
mybook.save("结果表-成绩表.xlsx")
for myrow in range(mysheet.max_row, 1, -1)
表示此循环以mysheet.max_row开始,到第一行结束,每循环一次,myrwo减一
mysheet[myrow][1:6]]
表示此行的求和运算从第2列第6列内容
mysheet.delete_rows(myrow)
从该工作表删除该行
(四十六)在工作表中删除所有重复的行
# 导入openpyxl模块
import openpyxl
# 根据“员工表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("员工表.xlsx", data_only=True)
mysheet = mybook.active
# 按行获取员工表(mysheet)的单元格数据(第一行除外)
myrows=list(mysheet.values)[1:]
#删除员工表(mysheet)的行(第一行除外)
while mysheet.max_row>1:
mysheet.delete_rows(2)
mylist=[]
for myrow in myrows:
# 如果在列表(mylist)中不存在行(myrow)
if myrow not in mylist:
#则在列表(mylist)中添加行(myrow)
mylist.append(myrow)
#在员工表(mysheet)中添加不重复的行(myrow)
for myrow in mylist:
mysheet.append(myrow)
# 保存工作簿,保存为"结果表-员工表.xlsx"文件
mybook.save("结果表-员工表.xlsx")
(四十七)使用行参数随机排列工作表
# 导入openpyxl模块
import openpyxl
import random
# 根据“员工表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("员工表.xlsx", data_only=True)
mysheet = mybook.active
# 按行获取员工表(mysheet)的所有单元格数据(第一行除外)
myvalues = list(mysheet.values)[1:]
mynewbook = openpyxl.Workbook()
mynewsheet = mynewbook.active
mynewsheet.title = '员工表'
mynewsheet.append(['工号', '部门', '姓名', '最高学历', '专业', '出生年份', '出生月份', '出生日'])
# 随机排列行
random.shuffle(myvalues)
# 在新员工表(mynewsheet)中添加经过随机排列的行
for myrow in myvalues:
mynewsheet.append(myrow)
# 保存工作簿,保存为"结果表-员工表.xlsx"文件
mybook.save("结果表-员工表.xlsx")
random.shuffle(myvalues)
表示对所有行(myvalues)进行随机排列
注意使用random.shuffle()方法,还要添加 import random
(四十八)倒序排列工作表的所有数据
# 导入openpyxl模块
import openpyxl
# 根据“员工表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("员工表.xlsx", data_only=True)
mysheet = mybook.active
# 按行获取员工表(mysheet)的所有单元格数据(第一行除外)
myrows = list(mysheet.values)[1:]
mynewbook = openpyxl.Workbook()
mynewsheet = mynewbook.active
mynewsheet.title = '员工表'
mynewsheet.append(['工号', '部门', '姓名', '最高学历', '专业', '出生日期'])
#在 myrows 中倒序排列所有的行
myrows.reverse()
# 在新员工表(mynewsheet)中添加经过倒序排列的行
for myrow in myrows:
mynewsheet.append(myrow)
# 保存工作簿,保存为"结果表-员工表.xlsx"文件
mybook.save("结果表-员工表.xlsx")
myrows.reverse()
表示倒序排列列表(myrows)的所有成员,reverse()方法没有返回值,倒序排列结果就在myrows中,也可以使用 myrows[::-1] 代替 myrows.reverse() 实现相同功能
(四十九)根据首列数据升序排列工作表
# 导入openpyxl模块
import openpyxl
# 根据“录取表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("录取表.xlsx", data_only=True)
mysheet = mybook['录取表']
# 按行获取录取表(mysheet)的单元格数据(myrange)
myrange=list(mysheet.values)
#根据录取表(mysheet)创建(复制)新录取表(mynewsheet)
mynewsheet = mybook.copy_worksheet(mysheet)
mynewsheet.title = '新录取表'
#删除新录取表(mynewsheet)第3行之后的行(即删除所有考生)
while mynewsheet.max_row>3:
mynewsheet.delete_rows(4)
#从myrange第四行开始先排序再循环,
#然后在新录取表(mynewsheet)中添加经过升序排列的考生
for myrow in sorted(myrange[3:]):
mynewsheet.append(myrow)
# 保存工作簿,保存为"结果表-录取表.xlsx"文件
mybook.save("结果表-录取表.xlsx")
sorted(myrange[3:])
表示对指定范围(myrange[3:])的首列数据进行升序排列
需要注意的是sorted(iterable)函数的 参数iterable必须是一个可迭代对象
若要降序排序,则写成sorted(myrange[3:],reverse=True)
(五十)根据指定列数据升序排列工作表
# 导入openpyxl模块
import openpyxl
# 根据“录取表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("录取表.xlsx", data_only=True)
mysheet = mybook['录取表']
# 按行获取录取表(mysheet)的单元格数据(myrange)
myrange=list(mysheet.values)
#根据录取表(mysheet)创建(复制)新录取表(mynewsheet)
mynewsheet = mybook.copy_worksheet(mysheet)
mynewsheet.title = '新录取表'
#删除新录取表(mynewsheet)第3行之后的行(即删除所有考生)
while mynewsheet.max_row>3:
mynewsheet.delete_rows(4)
#从myrange第四行开始先根据总分列对行进行升序排序然后在循环,
for myrow in sorted(myrange[3:],key=lambda x:x[3]):
#在新录取表(mynewsheet)中添加经过升序排列后的考生
mynewsheet.append(myrow)
# 保存工作簿,保存为"结果表-录取表.xlsx"文件
mybook.save("结果表-录取表.xlsx")
sorted(myrange[3:],key=lambda x:x[3])
表示根据第四列的数据对指定范围(myrange[3:])的所有行(从第4行开始)进行升序排列。
lambda x:x[3] 是一个匿名函数。此案例中key=lambda x:x[3]代表myrange的第4列(总分列)
如果key=lambda x:x[2]则表示根据第3列(姓名)的数据