Python Excel vlookup函数实现过程解析


Posted in Python onJune 22, 2020

用法:注意是用英文的逗号",",且之间没有空格。

文件名,[工作表名称,不写则默认当前激活的表],[从第几行开始,不写则默认第二行,因为很多表第一行是title],列名(第一列是要查找的元素,列名可以不连续,比如“ade”)

脚本会自动把要查找的第一列进行大小写变换,去除空格等操作,下面的例子中,第一列的名字有的是大写,有的小写,前后还有空格,脚本会默认它们相同

现有Sheet1,内容如下

Python Excel vlookup函数实现过程解析

Sheet2内容如下

Python Excel vlookup函数实现过程解析

想把 Sheet1 的 B,C 列的信息复制到 Sheet2 的 B,C列上,执行脚本:

Source fileName,[sheetName],[row],columns:
vlookup.xlsx,Sheet1,1,abc
Target fileName,[sheetName],[row],columns:
vlookup.xlsx,Sheet2,1,abc
{'name': ['Lao Wang', 'Zhang San'], 'age': [23, 25], 'id': [23429234, None], 'phone': ['18292942422', '1000101010'], 'addr': ['BeiJIng', None]}
{'addr': [None, None], 'phone': [None, None], 'id': [None, None], 'age': [None, None], 'name': [None, None]}
Processing...
Done.

然后Sheet2的内容就变成了:

Python Excel vlookup函数实现过程解析

import openpyxl

def read_Excel(path,sheetName,row,*col):
  # 默认从第二行开始,因为很多表都有表头
  if row == '':
    row = 2
  else:
    row = int(row)
  workbook = openpyxl.load_workbook(path)
  # 默认打开当前激活的工作表
  if sheetName == "":
    sheet0 = workbook.active # 获取当前激活的工作表
  else:
    sheet0 = workbook[sheetName] # 如果制定了工作表,就打开指定的工作表
  highest = sheet0.max_row
  case_list = {}
  # title 所在列,对比的那一列,假设A列
  title = col[0]
  for i in range(row,highest+1): # 遍历行
    value_list = []
    if sheet0[title+str(i)].value == None: # 如果A5是空的,pass
      pass
    else:
      v1 = sheet0[title+str(i)].value.lower().strip() # 忽略大小写和前后空格
      # 除去 title的其他列
      for j in range(1,len(col)):
        v2 = sheet0[col[j]+str(i)].value
        value_list.append(v2)
      case_list[v1] = value_list
  print(case_list)
  return case_list

def write_Excel(dict,path,sheetName,row,*col):
  # 将处理好的数据再次写入excel
  if row == "":
    row = 2
  else:
    row = int(row)
  workbook = openpyxl.load_workbook(path)
  if sheetName == "":
    sheet0 = workbook.active # 获取当前激活的工作表
  else:
    sheet0 = workbook[sheetName]
  highest = sheet0.max_row
  # case title 所在列
  title = col[0]
  for i in range(row,highest+1):
    if sheet0[title + str(i)].value != None:
      v1 = sheet0[title + str(i)].value.lower().strip() # 忽略大小写和前后空格
      for key in dict:
        if key == v1:
          for j in range(1,len(col)):
            v2 = sheet0[col[j]+str(i)]
            v2.value = dict[key][j-1]
  workbook.save(path)

def process(r1,r2):
  # 对比处理两次读取的内容,然后更新r2的内容
  print('Processing...')
  for key in r1:
    if key in r2:
      length = len(r1[key])
      if length > 0:
        for i in range(0, len(r1[key])):
          # 如果想要不想覆盖原有的数值,可以取消注释,然后删除下面那行
          # if r2[key][i] == None:
            # r2[key][i] = r1[key][i]
          r2[key][i] = r1[key][i]
    else:
      pass
  
  return r2

def manual():
  info1 = input('Read from fileName,[sheetName],[row],columns:\n')
  file1,sheetName1,row1,list1 = info1.split(',')
  
  info2 = input('Write into fileName,[sheetName],[row],columns:\n')
  file2,sheetName2,row2,list2 = info2.split(',')

  r1 = read_Excel(file1,sheetName1,row1,*list1)
  r2 = read_Excel(file2,sheetName2,row2,*list2)

  r3 = process(r1,r2)
  write_Excel(r3,file2,sheetName2,row2,*list2)

  print('Done.')

if __name__ == "__main__":
  manual()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python CSV模块使用实例
Apr 09 Python
python将字符串转换成数组的方法
Apr 29 Python
Python字典数据对象拆分的简单实现方法
Dec 05 Python
Python简单实现阿拉伯数字和罗马数字的互相转换功能示例
Apr 17 Python
Python根据成绩分析系统浅析
Feb 11 Python
Python定时任务APScheduler的实例实例详解
Jul 22 Python
python命名空间(namespace)简单介绍
Aug 10 Python
使用 Python 清理收藏夹里已失效的网站
Dec 03 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
Django的ListView超详细用法(含分页paginate)
May 21 Python
Python使用Chrome插件实现爬虫过程图解
Jun 09 Python
基于SQLAlchemy实现操作MySQL并执行原生sql语句
Jun 10 Python
宝塔面板成功部署Django项目流程(图文)
Jun 22 #Python
python和php哪个更适合写爬虫
Jun 22 #Python
如何理解python对象
Jun 21 #Python
什么是python的必选参数
Jun 21 #Python
什么是python的自省
Jun 21 #Python
python的json包位置及用法总结
Jun 21 #Python
为什么相对PHP黑python的更少
Jun 21 #Python
You might like
怎样在PHP中通过ADO调用Asscess数据库和COM程序
2006/10/09 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
使用JavaScript创建新样式表和新样式规则
2016/06/14 PHP
PHP 二级子目录(后台目录)设置二级域名
2017/03/02 PHP
PHP删除二维数组中相同元素及数组重复值的方法示例
2017/05/05 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
PHP如何使用JWT做Api接口身份认证的实现
2020/02/03 PHP
基于jquery可配置循环左右滚动例子
2011/09/09 Javascript
js 固定悬浮效果实现思路代码
2013/08/02 Javascript
js中的replace方法使用介绍
2013/10/28 Javascript
JavaScript的各种常见函数定义方法
2014/09/16 Javascript
Nodejs学习笔记之Global Objects全局对象
2015/01/13 NodeJs
javascript中对变量类型的判断方法
2015/08/09 Javascript
如何使用headjs来管理和异步加载js
2016/11/29 Javascript
原生的强大DOM选择器querySelector介绍
2016/12/21 Javascript
React应用中使用Bootstrap的方法
2017/08/15 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
VueJs监听window.resize方法示例
2018/01/17 Javascript
vue cli 3.0 使用全过程解析
2018/06/14 Javascript
详解Vue中使用Echarts的两种方式
2018/07/03 Javascript
vue 使用html2canvas将DOM转化为图片的方法
2018/09/11 Javascript
利用js实现简易红绿灯
2020/10/15 Javascript
[03:09]2014DOTA2国际邀请赛 赛场上的美丽风景线 中国Coser也爱DOTA2
2014/07/20 DOTA
Python中的深拷贝和浅拷贝详解
2015/06/03 Python
这可能是最好玩的python GUI入门实例(推荐)
2019/07/19 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
写给保洁员表扬信
2014/01/08 职场文书
致长跑运动员加油稿
2014/02/20 职场文书
司法所长先进事迹
2014/06/02 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
优秀班主任申报材料
2014/12/16 职场文书
春节慰问简报
2015/07/21 职场文书
领导莅临指导欢迎词
2015/09/30 职场文书
MySQL中使用or、in与union all在查询命令下的效率对比
2021/05/26 MySQL
详细介绍Next.js脚手架完整搭建封装
2022/04/26 Javascript
大脑的记忆过程在做数据压缩,不同图形也有共同的记忆格式
2022/04/29 数码科技