首页 > 其他分享 >openpyxl模块------------------比对数据(不同顺序相同的数据)

openpyxl模块------------------比对数据(不同顺序相同的数据)

时间:2023-07-27 16:49:15浏览次数:23  
标签:openpyxl ------------------ value name cell column save 数据 row

任务目的
从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("保存完成!")


实现效果如下:

 

 

 

标签:openpyxl,------------------,value,name,cell,column,save,数据,row
From: https://www.cnblogs.com/cherishthepresent/p/17585330.html

相关文章

  • 全国5A级别的旅游景区
    背景这个就是老婆突然说想去三亚玩了,我一想,是不是整理下全国的5a级别的景区呢,后面看情况*打卡呢。说干就干。官方站点国家的5a景点,必须从官方*啊,家人们,直接上链接https://zwfw.mct.gov.cn/scenicspot?type=gb表格版本的官方的信息看起*分页了,也比较乱,我这里整理了一个一张......
  • Vue3多条数据复制功能,复制内容用逗号拼接
    <divclass="person-list"><divclass="person-item">9939939939399399</div><divclass="person-item">1111111111111111</div></div>&......
  • FUNCTION security.to_date does not exist
    方法函数不存在解决:oracle中说明使用的to_date不存在或当前版本不支持,换成to_days就可以了如果是mysql中,mysql并不支持to_date方法,所以需要改为str_to_date方法 或修改select*fromas_gen_plan_recordtwhereDATE_FORMAT(t.time,'%Y-%m-%d')>=DATE_FORMAT(:begi......
  • 防干扰/抗电压波动单按键/1路触摸触控芯片VK36N1D SOT23-6 适用于厨房秤/温控器/加湿
    触摸芯片是一种可感应人体触摸的微处理器,其工作原理是通过感应人体触摸带来的电容变化而实现的;当人体接近触摸屏幕表面时,会引起触摸屏与人体间的电容改变,并且形成了一个新的电场分布,芯片会根据这个电容改变来计算出具体的触摸位置和操作手势。目前触摸芯片应用涉及于消费类电子、......
  • P9017 [USACO23JAN] Lights Off G 题解
    Description给定正整数\(N\),和两个长为\(N\)的\(01\)序列\(a\)和\(b\)。定义一次操作为:将\(b\)序列中的一个值翻转(即\(0\)变成\(1\),\(1\)变成\(0\),下同)。对于\(b\)序列中每个值为\(1\)的位置,将\(a\)序列中对应位置的值翻转。将\(b\)序列向右循环移位......
  • Linux基础—vmvare安装及centos7安装
    Linux基础#https://zhuanlan.zhihu.com/p/429509333#一什么是操作系统OperatingSystem(操作系统)简称OSWindows,MacOS,Linux都是操作系统#二什么是BootLoader在嵌入式操作系统中,BootLoader是在操作系统内核运行之前运行。可以初始化硬件设备、建立内存空间映射图,从......
  • P2352 队爷的新书
    P2352队爷的新书-洛谷|计算机科学教育新生态(luogu.com.cn)题意大概是给n个区间,如果某个数属于若干区间的话,这些区间的这个数的和最大是多少。毫无疑问,贪心来看这个数必然是某个区间的右端点。那么接下来很容易想到按照右端点排一下序,来计算相应的和。但n是1e5级别的,n^......
  • 初赛备考记录
    目录NOIP初赛备考Week18.11~8.201.CSP-J20222.CSP-J20213.CSP-J20204.CSP-J20195.SCP-J2022NOIP初赛备考Week18.11~8.20第一周先看书,看以前的blog(传送门)复习,大概过一下知识点。做一下初赛卷练练手。1.CSP-J2022【总结】【传送门】https://zhuanlan.zhihu.com/p/56......
  • 最简单的 Git 服务器
    程序员的代码仓库,总是需要托管一份在服务器,这样才保险,也方便使用。今天就来谈谈Git服务器。一、代码托管服务一般情况下,都不建议自己搭建Git服务器,而要使用现成的服务,也就是代码托管服务。它们都是免费的。GitHubGitlabBitbucketCodebergsourcehutGitee其中,除......
  • react useEffect a页面跳转b页面,b页面跳转a页面,接口调用多次
    reactuseEffecta页面跳转b页面,b页面跳转a页面,接口调用多次useEffect(()=>{xxx();return()=>{history?.go(0);};},[]);我的解决方式是在,在离开页面之前触发return()=> {history?.go(0);};当前页面刷新,清空了当前缓存的数据,也相当于第一次......