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中的jquery PyQuery库使用小结
May 13 Python
Python 迭代器工具包【推荐】
May 06 Python
Python中使用装饰器来优化尾递归的示例
Jun 18 Python
PyQt 线程类 QThread使用详解
Jul 16 Python
python OpenCV学习笔记之绘制直方图的方法
Feb 08 Python
python中logging包的使用总结
Feb 28 Python
python中subprocess批量执行linux命令
Apr 27 Python
pandas ix &iloc &loc的区别
Jan 10 Python
Python自动化导出zabbix数据并发邮件脚本
Aug 16 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
pytorch实现seq2seq时对loss进行mask的方式
Feb 18 Python
Python如何使用turtle库绘制图形
Feb 26 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面向对象概念
2011/11/06 PHP
PHP实现支持GET,POST,Multipart/form-data的HTTP请求类
2014/09/24 PHP
网页常用特效代码整理
2006/06/23 Javascript
javascript IE中的DOM ready应用技巧
2008/07/23 Javascript
很全的显示阴历(农历)日期的js代码
2009/01/01 Javascript
IE浏览器打印的页眉页脚设置解决方法
2009/12/08 Javascript
自己写的Javascript计算时间差函数
2013/10/28 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
2016/12/20 Javascript
js css3实现图片拖拽效果
2017/03/04 Javascript
jquery插件ContextMenu设置右键菜单
2017/03/13 Javascript
vue使用Axios做ajax请求详解
2017/06/07 Javascript
Angular2关于@angular/cli默认端口号配置的问题
2017/07/15 Javascript
Swiper自定义分页器使用详解
2017/12/28 Javascript
JavaScript实现连连看连线算法
2019/01/05 Javascript
详解JavaScript 新语法之Class 的私有属性与私有方法
2019/04/23 Javascript
JQuery使用数组遍历跳出each循环
2020/09/01 jQuery
原生JavaScript实现幻灯片效果
2021/02/19 Javascript
[02:15]2015国际邀请赛选手档案IG.Ferrari 430
2015/07/30 DOTA
python 实现文件的递归拷贝实现代码
2012/08/02 Python
python开发之str.format()用法实例分析
2016/02/22 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
Python 单元测试(unittest)的使用小结
2018/11/14 Python
python实现感知器算法(批处理)
2019/01/18 Python
Python实现TCP通信的示例代码
2019/09/09 Python
使用phonegap操作数据库的实现方法
2017/03/31 HTML / CSS
应用化学专业本科生求职信
2013/09/29 职场文书
小学生优秀评语大全
2014/04/22 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
国贸专业求职信
2014/06/28 职场文书
英文辞职信范文
2015/05/13 职场文书
同事去世追悼词
2015/06/23 职场文书
子女赡养老人协议书
2016/03/23 职场文书
Html分层的box-shadow效果的示例代码
2021/03/30 HTML / CSS
Ajax实现三级联动效果
2021/10/05 Javascript
数据设计之权限的实现
2022/08/05 MySQL