Python对excel操作——分类汇总278张Excel表中的数据

目录

一、题目

1、描述

2、展示

①原图

②效果图

​二、分析

1、创建工作簿对象以及工作表对象

2、获取数据

3、数据存储

4、数据处理

三、源码


一、题目

1、描述

从278张表中获取物料编号、物料描述以及批号批数量三个数据,将物料号一样的产品的数量进行相加,得到此物料号总的数量,然后按降序排列存入一个新表中

2、展示

①原图

Python对excel操作——分类汇总278张Excel表中的数据_第1张图片

②效果图

Python对excel操作——分类汇总278张Excel表中的数据_第2张图片 二、分析

1、创建工作簿对象以及工作表对象

        在练习了多个对excel的操作之后,总结出一个规律,就是不管是想怎么操作,最先要做的就是获取、创建工作簿对象以及获取、创建工作表对象;

        因为不对原工作簿进行操作,所以要写入到了另一个工作簿中,写入到一个工作簿中时首先要先生成一个工作簿对象和工作表对象,才能进行写入,而写入的数据来源是源文件,所以要先获取到源文件工作簿对象和工作表对象;

wb = openpyxl.Workbook()#创建工作簿对象
ws = wb.active#创建工作表对象
ws.title = '汇总'#给工作表赋名字

ws.append(['物料编号', '物料描述', '批号批数量'])#写入数据,此时传入的数据只能是列表或者元组



all_wb = openpyxl.load_workbook('日领料单.xlsx')#获取工作簿对象
all_ws = all_wb.worksheets#获取工作表对象,因为一个工作簿中保存着很多工作表,所以此时的工作表对象存储着多个工作表对象的地址的元组

2、获取数据

        获取的工作表对象存储的是多个工作表的地址,所以此时用遍历的in依次取出存储的对象表的地址;

        工作表对象中存储的是表中每一行的对象地址,此时用同样的方法依次取到每个表中的每一行的地址;

        然后再通过得到的每一行的对象去得到想要的列的对象,在通过获取对象值的方法去得到想要的值;

for w in all_ws:
    for row in range(4, w.max_row-3):

3、数据存储

        因为不是简单的拿数据,而是要对数据做合并和排序的处理,所以拿出来的数据要进行存储;

        因为每一次得到数据具有对应的关系,所以要用列表进行处理,将物料编号作为大字典的键,值为物料描述和批量数量构成的小字典,然后再将大字典添加到另一个字典中;

        添加到字典中时,要进行去重以及批量数量的求和,因为字典的键是惟一的,而且可以通过字典的键去判断其是否已经存在,如果已经存在,则要进行的就是将批量数据的值进行求和,如果不存在则加入字典中;

for w in all_ws:
    for row in range(4, w.max_row-3):
        if w['K'+str(row)].value not in res.keys():
            res.update({w['K'+str(row)].value:{'物料描述':w['P'+str(row)].value,
                                               '批号批数量':int(w['N'+str(row)].value)}})
        else:
            res[w['K'+str(row)].value]['批号批数量'] += int(w['N'+str(row)].value)
li = list(res.items())

4、数据处理

        在数据已经存储到字典中之后,还需要做的操作就是根据批量数量的值进行排序了,因为字典是无序的,所以要先将字典转为列表;先要将字典中的键和值通过方法给读出来,一个键值对保存在一个元组中,将元组转化为列表,然后对列表进行排序;

        排序使用的是匿名函数lambda,因为存储时是大字典套中字典套小字典,而遍历的是大字典

,也就是将中字典中的键值对取出来存储到元组中,而中字典点中存储着小字典,所以元祖中存储的也有字典,而要进行排序的值为字典中的值,所以要通过字典的键去获取相对应数值

        套的小字典也可以用列表代替,此时获取值是会简单一点

三、源码

import openpyxl


wb = openpyxl.Workbook()
ws = wb.active
ws.title = '汇总'

ws.append(['物料编号', '物料描述', '批号批数量'])

# K4---物料编号(无重复) P4---物料描述(有重复)
# N4---批号批数量(累加) O4[-1]---产品型号(序号)

# max_row-3---最大行
all_wb = openpyxl.load_workbook('日领料单.xlsx')
all_ws = all_wb.worksheets
res = {}
for w in all_ws:
    for row in range(4, w.max_row-3):
        if w['K'+str(row)].value not in res.keys():
            res.update({w['K'+str(row)].value:{'物料描述':w['P'+str(row)].value,
                                               '批号批数量':int(w['N'+str(row)].value)}})
        else:
            res[w['K'+str(row)].value]['批号批数量'] += int(w['N'+str(row)].value)
li = list(res.items())
print(li)
li.sort(key= lambda x:x[1]['批号批数量'], reverse=True)
for x in li:
    ws.append([x[0], x[1]['物料描述'], x[1]['批号批数量']])

wb.save('demo.xlsx')

你可能感兴趣的:(#,习题,python,开发语言)