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字符串排序方法
Aug 29 Python
python实现简单中文词频统计示例
Nov 08 Python
Flask之flask-script模块使用
Jul 26 Python
Python实现按逗号分隔列表的方法
Oct 23 Python
使用python3调用wxpy模块监控linux日志并定时发送消息给群组或好友
Jun 05 Python
Python获取统计自己的qq群成员信息的方法
Nov 15 Python
pycharm运行scrapy过程图解
Nov 22 Python
python中pandas库中DataFrame对行和列的操作使用方法示例
Jun 14 Python
Python学习之路之pycharm的第一个项目搭建过程
Jun 18 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
Python实现数字的格式化输出
Aug 01 Python
python 发送get请求接口详解
Nov 17 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中的替代语法介绍
2015/01/09 PHP
php实现简单文件下载的方法
2015/01/30 PHP
php及codeigniter使用session-cookie的方法(详解)
2017/04/06 PHP
关于Laravel参数验证的一些疑与惑
2019/11/19 PHP
JQuery读取XML文件数据并显示的实现代码
2009/12/16 Javascript
IE之动态添加DOM节点触发window.resize事件
2010/07/27 Javascript
jsPDF生成pdf后在网页展示实例
2014/01/16 Javascript
使用angularjs创建简单表格
2016/01/21 Javascript
AngularJS使用ng-app自动加载bootstrap框架问题分析
2017/01/04 Javascript
jQuery实现弹出窗口弹出div层的实例代码
2017/01/09 Javascript
JavaScript实现省市县三级级联特效
2017/05/16 Javascript
vue-router+nginx 非根路径配置方法
2018/06/30 Javascript
改进 JavaScript 和 Rust 的互操作性并深入认识 wasm-bindgen 组件
2019/07/13 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
2020京东618叠蛋糕js脚本(亲测好用)
2020/06/02 Javascript
[02:27]《DAC最前线》之附加赛征程
2015/01/29 DOTA
详解Python中的多线程编程
2015/04/09 Python
python利用lxml读写xml格式的文件
2017/08/10 Python
Python内置函数reversed()用法分析
2018/03/20 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
python设定并获取socket超时时间的方法
2019/01/12 Python
python实现字典嵌套列表取值
2019/12/16 Python
Python dict的常用方法示例代码
2020/06/23 Python
利用python如何实现猫捉老鼠小游戏
2020/12/04 Python
实例教程 纯CSS3打造非常炫的加载动画效果
2014/11/05 HTML / CSS
Javascript如何发送一个Ajax请求
2015/01/26 面试题
小学班级口号
2014/06/09 职场文书
2014年工程工作总结
2014/11/25 职场文书
幽默导游词开场白
2015/05/29 职场文书
居住证明范文
2015/06/17 职场文书
小学毕业感言200字
2015/07/30 职场文书
贷款担保书范本
2015/09/22 职场文书
个人职业生涯规划之自我评估篇
2019/09/03 职场文书
导游词之新疆尼雅遗址
2019/10/16 职场文书
Python破解极验滑动验证码详细步骤
2021/05/21 Python
2022微信温控新功能上线
2022/05/09 数码科技