【python辅助excel】(4)

(三十)使用filter()转换成二维工作表

# 导入openpyxl模块
import openpyxl
# 根据“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx", data_only=True)
mysheet=mybook['一维表']
myrange=list(mysheet.values)[1:]
mytypes=list({mycell.value:'' for mycell in mysheet['B'][1:]})
#print(mytypes)
myquarters=list({mycell.value:'' for mycell in mysheet['A'][1:]})#采用字典的键值消除,数据是空的
#print(myquarters)
mynewbook=openpyxl.Workbook()
mynewsheet=mynewbook.active
mynewsheet.title='二维表'
mynewsheet.append(['季度']+mytypes)
for myquarter in myquarters:
    mysets=[(myquarter,mytype) for mytype in mytypes]
    mynewsheet.append([myquarter]+[list(filter(lambda myparam:myparam[0]==myset[0] and myparam[1]==myset[1],myrange))[0][2] for myset in mysets])

# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mynewbook.save("结果表-收入表.xlsx")

myquarters=list({mycell.value:'' for mycell in mysheet['A'][1:]})

表示通过字典清除一维表A列(季度)的重复内容,因此myquarters包含['1季度','2季度','3季度','4季度']

mytypes=list({mycell.value:'' for mycell in mysheet['B'][1:]})

表示通过通过字典清除一维表B列(业务类型)的重复内容,因此mytypes包含['加点收入','建材收入','其他收入']

list(filter(lambda myparam:myparam[0]==myset[0] and myparam[1]==myset[1],myrange))[0][2]

其中的filter()函数表示根据传入的参数myparam,对myrange范围(A2:C13)的数据进行筛选。在此处即是筛选 myrange 每行符合 myset[0] (季度)和 myset[1] (业务类型)的数据

代码要细看

 (三十一)使用zip()转换为一维工作表

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

mynewbook=openpyxl.Workbook()
mynewsheet=mynewbook.active
mynewsheet.title='收入表'
mynewsheet.append(['季度','业务类型','营业收入'])
myrange1=mysheet['A'][4:]
myrange2=mysheet.iter_rows(min_col=2,min_row=5)
for myquarter,myrow in zip(myrange1,myrange2):
    print([myquarter.value]+[mycell.value for mycell in myrow])
    for mytype,myamount in zip(mysheet['4'][1:],myrow):
        print(myquarter.value,mytype.value,myamount.value)
        mynewsheet.append([myquarter.value,mytype.value,myamount.value])
# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mynewbook.save("结果表-收入表.xlsx")

zip(myrange1,myrange2)

表示将myrange1和myrange2两个列表重新组成一个列表

zip(mysheet['4'][1:],myrow)

表示将mysheet['4'][1:]和myrow两个列表重新组成一个列表

(三十二)使用map()转换成一维工作表

# 导入openpyxl模块
import openpyxl

# 根据“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx", data_only=True)
mysheet = mybook['收入表']

mynewbook = openpyxl.Workbook()
mynewsheet = mynewbook.active
mynewsheet.title = '收入表'
mynewsheet.append(['季度', '业务类型', '营业收入'])
myrange1 = mysheet['A'][4:]
myrange2 = mysheet.iter_rows(min_col=2, min_row=5)
for myquarter, myrow in list(map(lambda x, y: [x, y], myrange1, myrange2)):
    print([myquarter.value] + [mycell.value for mycell in myrow])
    for mytype, myamount in list(map(lambda x, y: [x, y], mysheet['4'][1:], myrow)):
        print(myquarter.value, mytype.value, myamount.value)
        mynewsheet.append([myquarter.value, mytype.value, myamount.value])
# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mynewbook.save("结果表-收入表.xlsx")

 map(lambda x, y: [x, y], myrange1, myrange2)

表示以映射方式将两个列表重新组合成一个列表,即对应列组成一个列表元素

使用map()函数转换一维列表时要用到 lambda表达式(学习下lambda的语法)

(三十三)使用rows获取工作表的所有行

# 导入openpyxl模块
import openpyxl

# 根据“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx")
#获取收入表(mybook.ative)的行(myrows)
myrows=mybook.active.rows
#循环myrows的5,6,7,8行(myrow)
for myrow in list(myrows)[4:8]:
    #循环行(myrow)的B/C/D列的单元格
    for mycell in myrow[1:4]:
        #如果单元格不为空
        if mycell.value is not None:
            mycell.value*=10000
# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mybook.save("结果表-收入表.xlsx")

 myrows=mybook.active.rows

表示按行获取 mybook.active (活动工作表)的所有行

(三十四)使用iter_rows()指定数据范围

# 导入openpyxl模块
import openpyxl

# 根据“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx")
mysheet=mybook.active
#指定收入表(mysheet)的数据范围(myrange),即B5:D8
myrange=mysheet.iter_rows(min_row=5,min_col=2,max_row=8,max_col=4)
myrowindex=5
#循环数据范围(myrange)的行(myrow)
for myrow in myrange:
    myrowsum=sum([mycell.value for mycell in myrow])
    mysheet.cell(myrowindex,5).value=myrowsum
    myrowindex+=1
# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mybook.save("结果表-收入表.xlsx")

       myrange=mysheet.iter_rows(min_row=5,min_col=2,max_row=8,max_col=4)

表示 在工作表(mysheet)中设置数据按行操作的范围,即在工作表(mysheet)中指定B5到D8之间的所有单元格,该方法支持指定部分参数,其他参数按照默认值处理

例如: myrange=mysheet.iter_rows(min_row=5,min_col=2)

表示在工作表中指定从B5单元格到最后一个单元格之间的所有单元格。

 myrange=mysheet.iter_rows(max_row=8,max_col=4)

表示在工作表中指定从第一个单元格到D8单元格之间的所有单元格

(三十五)使用起止行号获取指定范围的行

# 导入openpyxl模块
import openpyxl

# 根据“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx")
mysheet = mybook.active
# 指定收入表(mysheet)第五行到第八行之间的行(myrows)
myrows = mysheet['5':'8']
myrowindex = 5

for myrow in myrows:
    # 对行(myrow)的B,C,D列的单元格数据求和(myrowsum)
    myrowsum = sum(mycell.value for mycell in myrow[1:4])
    # 在行(myrow)的第五列单元格写入求和数据
    mysheet.cell(myrowindex, 5).value = myrowsum
    myrowindex += 1
# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mybook.save("结果表-收入表.xlsx")

myrows = mysheet['5': '8']

表示收入表(mysheet)的第五行到第八行之间的所有行,5表示起始行号,8表示终止行号

该代码可写成myrows = mysheet['5:8']

(三十六)根据行号获取该行的所有单元格

# 导入openpyxl模块
import openpyxl

# 根据“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx")
mysheet = mybook.active
# 对第五行的B,C,D列(即2,3,4列)的单元格数据求和,并在合计列的单元格中写入合计
mysheet['E5']=sum([mycell.value for mycell in mysheet[5][1:4]])
mysheet['E6']=sum([mycell.value for mycell in mysheet[6][1:4]])
mysheet['E7']=sum([mycell.value for mycell in mysheet[7][1:4]])
mysheet['E8']=sum([mycell.value for mycell in mysheet[8][1:4]])
# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mybook.save("结果表-收入表.xlsx")

mysheet['E5']=sum([mycell.value for mycell in mysheet[5][1:4]])

表示对收入表(mysheet)的第五行的B,C,D列的单元格数据求和,mysheet[5] 表示收入表(mysheet) 的第五行的所有单元格,mysheet[5][1:4]表示以列表的切片方式获取第五行的B,C,D列的单元格,mycell.value表示单元格的数据

 (三十七)根据起止行号隐藏指定范围的行

# 导入openpyxl模块
import openpyxl

# 根据“员工表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("员工表.xlsx")
mysheet = mybook.active
# 隐藏员工表(mysheet)的第7到12行
mysheet.row_dimensions.group(7, 12, hidden=True)
# 保存工作簿,保存为"结果表-员工表.xlsx"文件
mybook.save("结果表-员工表.xlsx")

mysheet.row_dimensions.group(7, 12, hidden=True)

参数7表示隐藏的起始行号,参数12表示隐藏的终止行号,参数 hidden=True表示执行隐藏操作

 (三十八)自定义工作表指定行的高度

# 导入openpyxl模块
import openpyxl

# 根据“收入表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("收入表.xlsx")
mysheet = mybook.active
# 自定义收入表(mysheet)的第六行的高度
mysheet.row_dimensions[6].height=30
# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mybook.save("结果表-收入表.xlsx")

 mysheet.row_dimensions[6].height=30

表示设置收入表(mysheet)的第6行的高度为30,mysheet.row_dimensions[7].height=30 表示设置第7行的高度为30

 (三十九)使用交错颜色设置行的背景

# 导入openpyxl模块
import openpyxl

# 根据“员工表.xlsx”文件内容,并创建工作簿
mybook = openpyxl.load_workbook("员工表.xlsx")
mysheet = mybook.active
# 根据指定的范围创建表格(mytable)
mytable = openpyxl.worksheet.table.Table(displayName='mytable', ref='A1:F12')
# 根据预留的样式以行交错风格创建表格样式mystyle
mystyle = openpyxl.worksheet.table.TableStyleInfo(name='TableStyleMedium13', showRowStripes=True)
# 在表格中应用新建的表格样式(mystyle)
mytable.tableStyleInfo = mystyle
# 在员工表(mysheet)中应用新建表格(样式)mytable
mysheet.add_table(mytable)
# 保存工作簿,保存为"结果表-员工表.xlsx"文件
mybook.save("结果表-员工表.xlsx")

mystyle = openpyxl.worksheet.table.TableStyleInfo(name='TableStyleMedium13', showRowStripes=True)

表示以交错风格在表格的行中应用应用预置的 TableStyleMedium13 样式,name 参数值表示预置的样式名称,showRowStripes=True 表示以行交错风格应用预置的表格样式

 (四十)根据特定要求对每行数据求和

# 导入openpyxl模块
import openpyxl

# 根据“收入表.xlsx”文件内容,并打开工作簿
mybook = openpyxl.load_workbook("收入表.xlsx", data_only=True)
mysheet = mybook.active
# 按行获取收入表(mysheet)的单元格数据(myvalues)
myvalues = list(mysheet.values)
# 创建空白的工作簿和工作表(即空白的新收入表)
mynewbook = openpyxl.Workbook()
mynewsheet = mynewbook.active
mynewsheet.title = '收入表'
mynewsheet.append(['姓名', '月份', '金额'])
# 从myvalues的第二行开始逐行循环(到最后一行)
for myrow in myvalues[1:]:
    mysum = 0
    mymonth = 0
    # 从行的第2列开始逐列循环
    for mycell in myrow[1:]:
        mymonth += 1
        # 累加行每个单元格的数据
        mysum += mycell
        # 如果累加和大于1000
        if mysum >= 10000:
            # 则在新收入表(mynewsheet)中添加姓名,月份,累加和
            mynewsheet.append([myrow[0], str(mymonth) + '月份', mysum])
            # 并跳出行的循环(即停止累加),直接进入下一循环
            break
# 保存工作簿,保存为"结果表-收入表.xlsx"文件
mybook.save("结果表-收入表.xlsx")

break 语句用来终止循环,即循环没有False条件或序列还没被全部完成,停止执行循环

此例中,break 用于在 if mysum >= 10000 满足时,终止 for mycell in myrow[1:],直接进入

for myrow in myvalues[1:] 的下一次循环

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值