openpyxl模块------------------比对数据(不同顺序相同的数据)
任务目的
从data.xlsx中获取姓名,学号字段,然后在find.xlsx中根据姓名查找000字段,将匹配到的000字段,姓名和学号字段写入保存到新文件中。
思路过程
核心模块:openpyxl
读取data.xlsx文件,然后遍历所有行,将姓名和学号保存到字典1中。
读取find.xlsx文件,遍历所有行,将姓名和000保存到字典2中。
创建新xlsx文件,遍历字典1,如果name也在字典2中,则保存到新xlsx文件中。
执行代码:
import openpyxl
# 加载第一个Excel
wb1 = openpyxl.load_workbook("data.xlsx") # 加载Excel文件
ws1 = wb1[wb1.sheetnames[0]] # 获取第一张数据表
# 加载第二个Excel
wb2 = openpyxl.load_workbook("find.xlsx") # 加载Excel文件
ws2 = wb2[wb2.sheetnames[0]] # 获取第一张数据表
# 表名.cell(row=r,column=c).value 获取指定单元格内容
sno_d = {} #字典1,key:name;value:sno
id_d = {} #字典2,key:name;value:id
# 1.从表1中获取所有数据,保存到字典中
for r in range(3,ws1.max_row):
# 获取数据
name = ws1.cell(row=r, column=3).value
sno = ws1.cell(row=r, column=4).value
# 保存数据到字典1中
sno_d[name] = sno
# 2.遍历表2,寻找对应的id
for r in range(4,ws2.max_row):
# 获取数据
name = ws2.cell(row=r, column=3).value
ID = ws2.cell(row=r, column=2).value
# 保存数据到字典1中
id_d[name] = ID
# 3.写数据到Excel文件中
save_excel = openpyxl.Workbook()
save_sheet = save_excel.active # 获取当前活动的表,就是第一张表
save_sheet['A1'] = "姓名"
save_sheet['B1'] = "学号"
save_sheet['C1'] = "000#"
# 写入数据
r = 2
# 遍历第一个字典
for name in sno_d:
# 判断是否在第二个字典中
if name in id_d:
save_sheet.cell(row=r, column=1).value = name
save_sheet.cell(row=r, column=2).value = str(sno_d[name])
ID = "id_d[name]"
save_sheet.cell(row=r, column=3).value = ID[-6:-1]+ID[-1]
print(f"正在保存第{r-1}条数据...姓名为:{name}")
r = r + 1
save_excel.save("学号对应表.xlsx")
print("保存完成!")
实现效果:
###################################################
坑一:明明有10个数据,只能执行出来7条数据,原因是遍历的时候,范围弄错了
正确的代码如下:
import openpyxl
# 加载第一个Excel
wb1 = openpyxl.load_workbook("data.xlsx") # 加载Excel文件
ws1 = wb1[wb1.sheetnames[0]] # 获取第一张数据表
# 加载第二个Excel
wb2 = openpyxl.load_workbook("find.xlsx") # 加载Excel文件
ws2 = wb2[wb2.sheetnames[0]] # 获取第一张数据表
# 表名.cell(row=r,column=c).value 获取指定单元格内容
sno_d = {} #字典1,key:name;value:sno
id_d = {} #字典2,key:name;value:id
# 1.从表1中获取所有数据,保存到字典中
for r in range(1,ws1.max_row+1):
# 获取数据
name = ws1.cell(row=r, column=3).value
sno = ws1.cell(row=r, column=4).value
# 保存数据到字典1中
sno_d[name] = sno
# 2.遍历表2,寻找对应的id
for r in range(1,ws2.max_row+1):
# 获取数据
name = ws2.cell(row=r, column=3).value
ID = ws2.cell(row=r, column=2).value
# 保存数据到字典1中
id_d[name] = ID
# 3.写数据到Excel文件中
save_excel = openpyxl.Workbook()
save_sheet = save_excel.active # 获取当前活动的表,就是第一张表
save_sheet['A1'] = "姓名"
save_sheet['B1'] = "学号"
save_sheet['C1'] = "编号"
# 写入数据
r = 2
# 遍历第一个字典
for name in sno_d:
# 判断是否在第二个字典中
if name in id_d:
save_sheet.cell(row=r, column=1).value = name
save_sheet.cell(row=r, column=2).value = str(sno_d[name])
ID = 'id_d[name]'
save_sheet.cell(row=r, column=3).value = ID[-10:-1]+ID[-1]
print(f"正在保存第{r - 1}条数据...姓名为:{name}")
r = r + 1
save_excel.save("学号对应表.xlsx")
print("保存完成!")
实现效果如下: