【python辅助excel】(5)

本文介绍了如何使用Python的openpyxl库对Excel表格进行数据处理,包括利用列表推导式对多行数据求和,插入行制作工资条,删除特定位置的行,随机删除行,按条件删除行,删除重复行,随机排列和倒序排列工作表,以及根据指定列数据排序工作表。这些操作展示了对Excel数据进行高效处理和分析的方法。
摘要由CSDN通过智能技术生成

(四十一)使用列表推导式对多行数据求和

# 导入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列(姓名)的数据

​​​​​​​

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值