【python辅助excel】(3)

(二十一)将一个工作表拆分成多个工作表

# 导入openpyxl模块
import openpyxl

# 读取“录取.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("录取表.xlsx")
mysheet = mybook['录取表']
# 按行获取录取表(mysheet)的单元格数据(myrange)
myrange =list(mysheet.values)
#创建空白字典
mydict={}
#从myrange的第四行开始循环到最后一行
for myrow in myrange[3:]:
    #如果在字典(mydict)中存在某录取院校(myrow[0])
    #则直接在录取院校(mtrow[0])中添加考生([myrow])
    if myrow[0] in mydict.keys():
        mydict[myrow[0]]+=[myrow]
    #否则创建新录取院校
    else:
        mydict[myrow[0]]=[myrow]
#循环字典(mydict)的成员
for mykey,myvalue in mydict.items():
    #根据mykey(录取院校)创建新工作表(mynewsheet)
    mynewsheet=mybook.create_sheet(mykey+'录取表')
    #在新工作表(mynewsheet)中添加表头(录取院校、专业、考生姓名、总分)
    mynewsheet.append(myrange[2])
    #在新工作表(mynewsheet)中添加录取院校(mykey)的多个考生(myvalue)
    for myrow in myvalue:
        mynewsheet.append(myrow)
#保存工作簿,即将拆分结果保存在"结果表-录取表.xlsx"文件中
mybook.save("结果表-录取表.xlsx")

 本程序中,一个字典的键值对应的是一个列表,列表中有多个值以达到匹配多个的目的

(二十二)将多个工作表拼接成一个工作表

# 导入openpyxl模块
import openpyxl

# 根据“录取.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("录取表.xlsx")
#创建列表(mynewrows)
mynewrows=[]
#循环工作簿(mybook)的工作表(mysheet)
for mysheet in mybook:
    #将工作表(mysheet)的考生数据添加到mynewrows
    mynewrows+=[[mycell.value for mycell in myrow]for myrow in mysheet.rows][1:]
#创建新工作表(mynewsheet)即录取表
mynewsheet=mybook.create_sheet('录取表')
#设置新工作表(mynewsheet)的表头
mynewsheet.append(['录取院校','专业','考生姓名','总分'])
#在新工作表(mynewsheet)中添加所有考生
for mynewrow in mynewrows:
    mynewsheet.append(mynewrow)

#保存工作簿,即将拼接多个工作表的结果保存为"结果表-录取表.xlsx"文件
mybook.save("结果表-录取表.xlsx")

mynewrows+=[[mycell.value for mycell in myrow]for myrow in mysheet.rows][1:]

表示以切片的方式去掉每个工作表(如xx大学录取表)的表头

该行代码也可以用下列代码替代:

mynewrows=list(mysheet.values)[1:]

此外for mysheet in mybook 等价于 for mysheet in mybook.worksheets

 (二十三)使用列表操作符拼接两个工作表

# 导入openpyxl模块
import openpyxl

# 根据“订单表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("订单表.xlsx", data_only=True)
mysheet1=mybook['已出库订单']
mysheet2=mybook['为出库订单']
#将已出库订单表复制成全部订单表
mysheet3=mybook.copy_worksheet(mysheet1)
mysheet3.title='全部订单表'
#删除全部订单表的行(第一行除外)
while mysheet3.max_row>1:
    mysheet3.delete_rows(2)
mylist3=list(mysheet1.values)[1:]
mylist2=list(mysheet2.values)[1:]
#拼接已出库订单表(即列表mylist3)和未出库订单表(即列表mylist2)的所有行
#mylist3.extend(mtlist2)
mylist3=mylist3+mylist2
#根据订单编号升序排列全部订单表(即拼接之后的列表mylist3)的行
mylist3=sorted(mylist3,key=lambda x:x[1])
#将全部订单表(即拼接之后的列表mylist3)的行添加到mysheet3
for myrow in mylist3:
    mysheet3.append(myrow)
# 保存工作簿,保存为"结果表-录取表.xlsx"文件
mybook.save("结果表-订单表.xlsx")

mylist3=mylist3+mylist2 也可以直接使用 mylist3.extend(mtlist2)

 (二十四)使用列表推导式累加多个工作表

代码如下: 

#导入openpyxl模块
import openpyxl
#根据“利润表.xlsx”文件创建工作簿
mybook=openpyxl.load_workbook('利润表.xlsx')

#累加工作簿(mybook)的所有工作表的B5单元格数据
mysun=sum([mysheet['B5'].value for mysheet in mybook])

#在工作簿(mybook)中新增一个全年利润表(mysheet2)
mysheet2=mybook.copy_worksheet(mybook.worksheets[0])
mysheet2.title='全年利润表'

#在全变利润表(mysheet2)的对应单元格设置加数(合计)
mysheet2['B5'].value=mysum
mysheet2['B6'].value=mysum
mybook.save("结果表-利润表")

 mysun=sum([mysheet['B5'].value for mysheet in mybook])

是一个列表推导式,表示逐个获取工作簿(mybook)的所有工作表(mysheet)的 B5 单元格的数据,并用 sun() 函数 累加数据

在这里 mysheet['B5'] 和 mysheet.cell(5,2)作用相同,均指同一单元格

结果如下:

 (二十五)使用集合方法拼接两个工作表

代码如下:

# 导入openpyxl模块
import openpyxl
# 根据“订单表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("订单表.xlsx", data_only=True)
mysheet1=mybook['已出库订单']
mysheet2=mybook['未出库订单']
#将已出库订单表复制成全部订单表
mysheet3=mybook.copy_worksheet(mysheet1)
mysheet3.title='全部订单表'
#删除全部订单表的行(第一行除外)
while mysheet3.max_row>1:
    mysheet3.delete_rows(2)
#根据已出库订单表的行创建集合(myset1)
myset1=set(list(mysheet1.values)[1:])
#根据未出库订单表的行创建集合(myset2)
myset2=set(list(mysheet2.values)[1:])
#将myset1和myset2拼接成myset3,即生成全部订单表
myset3=myset1.union(myset2)

#将全部订单表(即拼接之后的列表mylist3)的行添加到mysheet3
for myrow in myset3:
    mysheet3.append(myrow)
# 保存工作簿,保存为"结果表-录取表.xlsx"文件
mybook.save("结果表-订单表.xlsx")

结果和上面的拼接效果一样

union() 方法实现集合拼接

myset3 集合成员的排列顺序可能与他们在 myset1 和 myset2 中的排列顺序不一致,并且可能每次在拼接之后的排列顺序都不一致,因为集合的成员和排列顺序无关

(二十六)使用集合方法拼接多个工作表

代码如下:

# 导入openpyxl模块
import openpyxl
# 根据“录取表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("录取表.xlsx", data_only=True)
mysheet1=mybook['北京大学录取表']
mysheet2=mybook['清华大学录取表']
mysheet3=mybook['浙江大学录取表']
mysheet4=mybook['武汉大学录取表']
#将北京大学录取表(mysheet1)复制成(全部院校)录取表(mysheet5)
mysheet5=mybook.copy_worksheet(mysheet1)
mysheet3.title='录取表'
#删除录取表(mysheet5)的行(第一行除外)
while mysheet5.max_row>1:
    mysheet5.delete_rows(2)
#根据北京大学录取表(mysheet1)的行创建集合(myset1)
myset1=set(list(mysheet1.values)[1:])
#根据清华大学录取表(mysheet2)的行创建集合(myset2)
myset2=set(list(mysheet2.values)[1:])
#根据浙江大学录取表(mysheet3)的行创建集合(myset3)
myset3=set(list(mysheet3.values)[1:])
#根据武汉大学录取表(mysheet4)的行创建集合(myset4)
myset4=set(list(mysheet4.values)[1:])
#将myset1,myset2,myset3,myset4拼接成myset5,即生成总录取表
myset5=myset1.union(myset2,myset3,myset4)

#根据集合(myset5)在(全部院校)录取表(mysheet5)中添加考生
for myrow in myset5:
    mysheet5.append(myrow)
# 保存工作簿,保存为"结果表-录取表.xlsx"文件
mybook.save("结果表-录取表.xlsx")

 注意:union() 方法参数可以有多个,即该方法可以拼接多个集合,参数(集合)之间使用逗   号分开即可

(二十七)使用集合方法筛选两个工作表

# 导入openpyxl模块
import openpyxl
# 根据“订单表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("订单表.xlsx", data_only=True)
mysheet1=mybook['全部订单表']
mysheet2=mybook['已出库订单表']

#将全部订单表(mysheet1)复制成未出库订单表(mysheet3)
mysheet3=mybook.copy_worksheet(mysheet1)
mysheet3.title='未出库订单表'
#删除未出库订单表(mysheet3)的行(第一行除外)
while mysheet3.max_row>1:
    mysheet3.delete_rows(2)
mylist1=list(mysheet1.values)[1:]
mylist2=list(mysheet2.values)[1:]
#根据全部订单表的行(第一行除外)创建集合(myset1)
myset1=set(mylist1)
#根据已出库订单表的行(第一行除外)创建集合(myset2)
myset2=set(mylist2)

#计算myset1和myset2两个集合的差集,即获得未出库名单
myset3=myset1.difference(myset2)

#根据集合(myset3)的行数据
for myrow in myset3:
    mysheet3.append(myrow)
# 保存工作簿,保存为"结果表-订单表.xlsx"文件
mybook.save("结果表-订单表.xlsx")

上面是输出结果,下面是原始文件 

myset3=myset1.difference(myset2)

表示 myset1 和 myset2 的差集,一般情况下,myset1代表全集,myset2代表子集

(二十八)使用对称差集方法筛选工作表

# 导入openpyxl模块
import openpyxl
# 根据“学员表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("学员表.xlsx", data_only=True)
mysheet1=mybook['Android学员表']
mysheet2=mybook['Java学员表']

#将Android学员表复制成仅学一门课程的学员表(mysheet3)
mysheet3=mybook.copy_worksheet(mysheet1)
mysheet3.title='仅学一门课程的学员表'
#删除仅学一门课程的学员表(mysheet3)的行(第一行除外)
while mysheet3.max_row>1:
    mysheet3.delete_rows(2)
#根据Android学员表(mysheet1)的行(第一行除外)创建集合(myset1)
myset1=set(list(mysheet1.values)[1:])
#根据Java学员表(mysheet2)的行(第一行除外)创建集合(myset2)
myset2=set(list(mysheet2.values)[1:])
#计算myset1和myset2两个集合的对称差集(myset3),即获得两个工作表(集合)不同的行
myset3=myset1.symmetric_difference(myset2)

#根据集合(myset3)的行数据
for myrow in myset3:
    mysheet3.append(myrow)
# 保存工作簿,保存为"结果表-学员表.xlsx"文件
mybook.save("结果表-学员表.xlsx")

结果:

 myset3=myset1.symmetric_difference(myset2)

表示 myset1 和 myset2 的对称差集 myset3,对称差集定义为集合A和集合B中所有不属于A∩B的元素的集合

(二十九)使用列表关键字筛选两个工作表

# 导入openpyxl模块
import openpyxl
# 根据“订单表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("订单表.xlsx", data_only=True)
mysheet1=mybook['全部订单表']
mysheet2=mybook['已出库订单表']

#将全部订单表(mysheet1)复制成未出库订单表(mysheet3)
mysheet3=mybook.copy_worksheet(mysheet1)
mysheet3.title='未出库订单表'
#删除未出库订单表(mysheet3)的行(第一行除外)
while mysheet3.max_row>1:
    mysheet3.delete_rows(2)
mylist1=list(mysheet1.values)[1:]
mylist2=list(mysheet2.values)[1:]
#循环全部订单表(mylist1列表)的行myrow
for myrow in mylist1:
    #如果行(myrow)不在已出库订单表(mylist2列表)中
    if myrow not in mylist2:
        #则添加到未出库订单表中
        mysheet3.append(myrow)
    
# 保存工作簿,保存为"结果表-订单表.xlsx"文件
mybook.save("结果表-订单表.xlsx")

 if myrow not in mylist2

表示要求若行 (myrow) 包含多列,则该行所有列的数据必须与列表 (mylist2) 中的某行的所有列的数据完全匹配,该表达式才为 False

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值