目录
一、题目
1、描述
2、展示
①原图
②效果图
二、分析
1、创建工作簿对象以及工作表对象
2、获取数据
3、数据存储
4、数据处理
三、源码
从278张表中获取物料编号、物料描述以及批号批数量三个数据,将物料号一样的产品的数量进行相加,得到此物料号总的数量,然后按降序排列存入一个新表中
在练习了多个对excel的操作之后,总结出一个规律,就是不管是想怎么操作,最先要做的就是获取、创建工作簿对象以及获取、创建工作表对象;
因为不对原工作簿进行操作,所以要写入到了另一个工作簿中,写入到一个工作簿中时首先要先生成一个工作簿对象和工作表对象,才能进行写入,而写入的数据来源是源文件,所以要先获取到源文件工作簿对象和工作表对象;
wb = openpyxl.Workbook()#创建工作簿对象
ws = wb.active#创建工作表对象
ws.title = '汇总'#给工作表赋名字
ws.append(['物料编号', '物料描述', '批号批数量'])#写入数据,此时传入的数据只能是列表或者元组
all_wb = openpyxl.load_workbook('日领料单.xlsx')#获取工作簿对象
all_ws = all_wb.worksheets#获取工作表对象,因为一个工作簿中保存着很多工作表,所以此时的工作表对象存储着多个工作表对象的地址的元组
获取的工作表对象存储的是多个工作表的地址,所以此时用遍历的in依次取出存储的对象表的地址;
工作表对象中存储的是表中每一行的对象地址,此时用同样的方法依次取到每个表中的每一行的地址;
然后再通过得到的每一行的对象去得到想要的列的对象,在通过获取对象值的方法去得到想要的值;
for w in all_ws:
for row in range(4, w.max_row-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())
在数据已经存储到字典中之后,还需要做的操作就是根据批量数量的值进行排序了,因为字典是无序的,所以要先将字典转为列表;先要将字典中的键和值通过方法给读出来,一个键值对保存在一个元组中,将元组转化为列表,然后对列表进行排序;
排序使用的是匿名函数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')