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利用beautifulSoup实现爬虫
Sep 29 Python
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Pytorch入门之mnist分类实例
Apr 14 Python
解决nohup重定向python输出到文件不成功的问题
May 11 Python
Python将8位的图片转为24位的图片实现方法
Oct 24 Python
python实现五子棋小程序
Jun 18 Python
Python 生成一个从0到n个数字的列表4种方法小结
Nov 28 Python
python绘制彩虹图
Dec 16 Python
Python Pillow(PIL)库的用法详解
Sep 19 Python
Python爬虫开发与项目实战
Dec 16 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 include加载文件两种方式效率比较
2010/08/08 PHP
PHP连接SQLSERVER 注意事项(附dll文件下载)
2012/06/28 PHP
php 强制下载文件实现代码
2013/10/28 PHP
WordPress中邮件的一些修改和自定义技巧
2015/12/15 PHP
php简单实现文件或图片强制下载的方法
2016/12/06 PHP
PHP实现的mysql读写分离操作示例
2018/05/22 PHP
php实现算术验证码功能
2018/12/05 PHP
基于jquery的一行代码轻松实现拖动效果
2010/12/28 Javascript
JavaScript对象之间的转换 jQuery对象和原声DOM
2011/03/07 Javascript
js解析xml字符串和xml文档实现原理及代码(针对ie与火狐)
2013/02/02 Javascript
关于编写性能高效的javascript事件的技术
2014/11/28 Javascript
jquery注册文本框获取焦点清空,失去焦点赋值的简单实例
2016/09/08 Javascript
微信公众号-获取用户信息(网页授权获取)实现步骤
2016/10/21 Javascript
jQuery向webApi提交post json数据
2017/01/16 Javascript
JS解决移动web开发手机输入框弹出的问题
2017/03/31 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
详解Js里的for…in和for…of的用法
2019/03/28 Javascript
详解Vue底部导航栏组件
2019/05/02 Javascript
axios如何取消重复无用的请求详解
2019/12/15 Javascript
vue实现滚动鼠标滚轮切换页面
2020/12/13 Vue.js
Python算法之栈(stack)的实现
2014/08/18 Python
Python中的测试模块unittest和doctest的使用教程
2015/04/14 Python
python脚本爬取字体文件的实现方法
2017/04/29 Python
python负载均衡的简单实现方法
2018/02/04 Python
numpy找出array中的最大值,最小值实例
2018/04/03 Python
Python解决两个整数相除只得到整数部分的实例
2018/11/10 Python
浅谈pyqt5中信号与槽的认识
2019/02/17 Python
解决python super()调用多重继承函数的问题
2019/06/26 Python
解决Python中pandas读取*.csv文件出现编码问题
2019/07/12 Python
德国家具在线:Fashion For Home
2017/03/11 全球购物
电子商务专业自我鉴定
2013/12/18 职场文书
秦兵马俑教学反思
2014/02/07 职场文书
GMP办公室主任岗位职责
2014/03/14 职场文书
团队队名口号大全
2014/06/06 职场文书
党员个人剖析材料(四风问题)
2014/10/07 职场文书
涪陵白鹤梁导游词
2015/02/09 职场文书