问题:老婆需要处理一个Excel表,有四千多行数据,如下;其中“型号规格”有很多重复的,需要将重复项进行合并,生成一个新的简洁的表。“带娃做作业”和“帮我合并表”,我得选一样,看了看娃那副调皮样,我速速决定处理Excel。谁说处理Excel一定要用眼睛一条条对,这不学了python么,干这点小活应该没啥问题。
思路:
1. 先上网查了查python里如何处理excel,查到有专门的模块xlrd和xlwt可用。 xlrd是读excel, xlwt是写excel库的。
2. 看了看别人写的例子,基本就明白怎么玩这两个模块了,读取的步骤就是:
a) 打开文件
b) 获取所有的sheet
c)通过名称或索引获取某张sheet
d)根据index,获取整行、整列或给定单元格的值,
写的步骤就是:
a)在内存中创建一个excel对象
b)在该excel对象中添加一张sheet
c)按给定逻辑往单元格中写入数据
d)将excel对象save到硬盘上
代码如下:
import xlrd
import xlwt
# 用xlrd打开待处理的excel文件,读取待处理的数据
xlsfile = r"D:\pythonProjects\practise\excelTest\Book1.xlsx"
book = xlrd.open_workbook(xlsfile) # 获取Excel文件的book对象
# sheet0 = book.sheet_by_index(0) # 通过sheet索引获得sheet对象
# nrows = sheet0.nrows # 获取需要处理的数据的行数
sheet_name = book.sheet_names()[0] # 尝试通过sheet名字来获取,当然如果知道sheet名字就可以直接指定
sheet1 = book.sheet_by_name(sheet_name)
nrows = sheet1.nrows # 获取需要处理的数据的行数
# 用xlwt创建一个excel对象,并初始化第一行的数据,为写入数据做准备
book_new = xlwt.Workbook(encoding='utf-8', style_compression=0)
sheet_new = book_new.add_sheet("sheet1", cell_overwrite_ok=True)
sheet_new.write(0, 0, "型号规格")
sheet_new.write(0, 1, "数量")
line = 1 #后面自动写入的数据从第二行开始
# 处理逻辑, calc list用来记录行是否已经处理过的标志,先将所有待处理的行初始为“待处理”的标志
calc = []
for k in range(1,nrows+1): # 第一行是列名,无须处理
calc.append(False) # False表示对应的行未被处理过
# 读取数据进行合并处理,并写入xlwt创建的对象中
for i in range(1,nrows):
if calc[i] == False: # False表示对应的行未被处理过相加过,True表示已相加过,跳过这条数据
totol_i = sheet1.row_values(i)[1] # 获取该行型号的初始数量
for j in range(i+1, nrows):
if sheet1.row_values(i)[0] == sheet1.row_values(j)[0]: #表示查到了同型号规格的数据
totol_i += sheet1.row_values(j)[1]
calc[j] = True #将第j列标志为已处理
#将计算的值写入新建的sheet_new
sheet_new.write(line, 0, sheet1.row_values(i)[0])
sheet_new.write(line, 1, totol_i)
line += 1
# 处理完毕,保存到桌面
book_new.save(r'C:\Users\pansc\Desktop\book1.xls')
相关excel文档:
https://download.csdn.net/download/pansc2004/10428856
https://download.csdn.net/download/pansc2004/10428849