现代生活中,我们很难不与excel表打交道,excel表有着易学易用的优点,只是当表中数据量很大,我们又需要从其他表册中复制粘贴一些数据(比如身份证号)的时候,我们会越来越倦怠,毕竟我们不是机器,没法长时间做某种重复性的枯燥操作。想象这样一个场景,我们有个几千行的表要填,需要根据姓名输入其对应的身份证号,但之前我们已经做过一个类似的表,同样的一些人的姓名跟身份证号是完整的,那么我们就需要通过一个个查找姓名,然后把身份证号码复制到我们当前要做的表里去。

当我日复一日重复着这些操作的时候,我都很想有一个自动化工具来完成这种操作,把做为人的我从这种非人的折磨里解脱出来,最后还是想到了python,因为这样我能很少的关注语言内部的一些细节,从而专注于解决这个问题。

其安装命令为 pip install openpyxl(在线安装)或者  easy_install openpyxl。

openpyxl的操作可以分四步,第一步载入现有workbook或者创建workbook到内存,分别使用

from openpyxl import load_workbook
from openpyxl import Workbook
#载入现有workbook中
wb1=load_workbook('lalala.xlsx')
"""
在源表数据量很大的时候,这里我们可以使用openpyxl的read_only模式
载入源表,这样做的好处是不用把整个表都载入内存
"""
wb1=load_workbook(filename='lalala.xlsx',read_only=True)
#创建workbook
wb2 = Workbook()

第二步就是操作excel表中的sheet了,通过Workbook()创建的workbook默认活动的sheet名称为Sheet,可以通过python交互命令行进行验证。

#获取活动的sheet
ws = wb.active
#设置sheet的标题
ws.title = "range names"
#创建以Pi为标题的sheet
ws = wb.create_sheet(title="Pi")
#获取标题为Sheet1的sheet
ws=wb['Sheet1']

第三步就是操作sheet中的cell了。需要注意的是,一个cell的位置由它所在的列跟行共同决定,比如一个cell,它在A列,并在第三行,就可以通过ws['A3']来访问。cell还具有row跟column属性,cell.row跟cell.column的数据类型如下图所示。

特别注意当用read_only模式载入workbook时,cell.row跟cell.column都是int对象。cell.column记录的是cell所在列离第一列的偏移数,并非workbook中真正代表列数的大写字母,比如“A”。

#获取第一行,数据类型为tuplerow=ws[1]#获取A列,数据类型为tuplecolumn=ws['A']#设置F5的值ws['F5']='sfs'#设置cell的值ws['F5'].value='hello'#获得cell的行数m=ws['F5'].row#获得cell的列数n=ws['F5'].column#获得特定区域的值,比如从F5到F30,数据类型为tuplek=ws['F5':'F30']#获得特定区域的值,比如从F5到G30,数据类型为tuplej=ws['F5':'G30']#获取sheet的最大行数row_count=ws.max_row#获取sheet的最大列数column_count=ws.max_column
最后一步把更改保存,这里要注意,当要保存的表在别的软件(microsoft office或者wps)中打开时,保存操作会报错

wb1.save('empty_book.xlsx')
wb2.save(filename='other_book.xlsx')

实现需求

新建一个get_info_from_excel.py文件,用你习惯的编辑器来编辑,首先需要引入openpyxl库中的load_workbook模块。可以使用load_workbook载入已经存在的excel表。

from openpyxl import load_workbook

我们的目的是从源excel表中提取信息并批量复制到目标excel表中,所以我们首先定义一些变量。

#源表名称
source_file_name='lalala.xlsx'
#目标表名称
target_file_name='lelele.xlsx'
#源表中要提取信息的sheet
source_sheet_name='Sheet2'
#目标表中要批量复制信息的sheet
target_sheet_name='Sheet2'
#源表中的标题行在哪一行
source_header_row=3
#目标表中的标题行在哪一行
target_header_row=2
#源表中要根据哪一列数据提取信息,根据源表标题行
source_cell_condition='姓名'
#目标表中要根据哪一列数据复制信息,根据目标表标题行
target_cell_condition='姓名'
#源表中要提取信息的列
source_cell_filled='身份证号'
#目标表中要复制信息的列
target_cell_filling='身份证号'

将源表跟目标表载入内存,方便下一步操作这两个表。

#在源表数据量很大的时候,这里我们可以使用openpyxl的read_only模式载入源表,这样做的好处是不用把整个表都载入内存
#wb_w=load_workbook(source_file_name)
wb_r=load_workbook(filename=source_file_name,read_only=True)
wb_w=load_workbook(target_file_name)

从前面已经定义的sheet名称跟标题行数获取源表跟目标表的标题行:

ws_r=wb_r[source_sheet_name]
ws_w=wb_w[target_sheet_name] header_row_r=ws_r[source_header_row]
header_row_w=ws_w[target_header_row]

操作源表标题行,获取我们想要的信息:

"""
openpyxl用read_only模式载入workbook时,获取到的cell不是一般的cell,
经过测试cell.column变成偏移了几列的整数,所以这里我们定义一个函数来处理,
把整数转换成excel真正的列数,比如“A”、“BB”等。
"""
def readOnly_offsetColunmNumber_toRealColumn(number):
column=''
if number<=26:
column=chr(number+ord('A')-1)
else:
number1=number//26
column1=chr(number1+ord('A')-1)
number2=number%26
column2=chr(number2+ord('A')-1)
column=column1+column2
return column #初始化两个变量,分别是源表的条件列,要复制的列
source_condition_column=''
source_filled_column=''
"""
循环源表的标题列,得到条件列的位置以及要复制列的位置,
再通过内嵌的循环得到条件列的最大行数
"""
for cell in header_row_r:
if cell.value==source_cell_condition:
source_condition_column=readOnly_offsetColunmNumber_toRealColumn(cell.column)
elif cell.value==source_cell_filled:
source_filled_column=readOnly_offsetColunmNumber_toRealColumn(cell.column)

操作目标表标题行,获取我们想要的信息:

#初始化两个变量,分别是目标表的条件列,要粘贴的列target_condition_column=''target_filling_column=''"""
循环目标表的标题列,得到条件列的位置以及要粘贴列的位置,
再通过内嵌的循环得到条件列的最大行数
"""for cell_j in header_row_w: if cell_j.value==target_cell_condition:
target_condition_column=cell_j.column
elif cell_j.value==target_cell_filling:
target_filling_column=cell_j.column

现在我们已经得到所有需要的信息,该到实际粘贴数据的时候了。

"""
循环目标表的条件列,内部嵌套循环源表的条件列,一旦目标表条件列的某个cell
与源表条件列某个cell的值相同,我们就把源表要复制列的同一行的cell的值
赋予目标表要粘贴列的同一行的cell。
"""
for cell_m in ws_w[target_condition_column+str(target_header_row+1):target_condition_column+str(ws_w.max_row)]:
for cell_n in ws_r[source_condition_column+str(source_header_row+1):source_condition_column+str(ws_r.max_row)]:
if cell_m[0].value==cell_n[0].value:
ws_w[target_filling_column+str(cell_m[0].row)].value=ws_r[source_filled_column+str(cell_n[0].row)].value

最后保存目标workbook就可以了。

wb_w.save(target_file_name)

 本文转载于https://www.py.cn/toutiao/11131.html

用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中的更多相关文章

  1. python库openpyxl操作excel

    废话不多说,看代码,不懂的留言. from openpyxl import * class ExcelUtil: ''' 读取excel文件内容''' def create_work_book(sel ...

  2. python用openpyxl操作excel

    python操作excel方法 1)自身有Win32 COM操作office但讲不清楚,可能不支持夸平台,linux是否能用不清楚,其他有专业处理模块,如下 2)xlrd:(读excel)表,xlrd ...

  3. Python使用openpyxl操作excel表格

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取 ht ...

  4. python使用openpyxl操作excel

    def initExcel(): file_path = "test.xlsx" file = load_workbook(file_path) table = file[&quo ...

  5. 在excel单元格中提取信息

    平时在excel中处理数据的时候,肯定会遇到在单元格提取信息的情况,比如在地址中提取省.市.地区等,如果数据源内容规整的话,可以直接使用left().right().mid()等函数直接提取,但是大多 ...

  6. python通过openpyxl操作excel

    python 对Excel操作常用的主要有xlwt.xlrd.openpyxl ,前者xlwt主要适合于对后缀为xls比较进行写入,而openpyxl主要是针对于Excel 2007 以上版本进行操作 ...

  7. python使用openpyxl操作excel总结

    安装openpyxl pip install openpyxl 简单示例 from openpyxl import Workbook #创建一个工作薄对象,也就是创建一个excel文档 wb = Wo ...

  8. python使用openpyxl操作execl

    openpyxl openpyxl可以用来对excel进行操作,但只能操作xlsx文件而不能操作xls文件. 主要用到三个概念:Workbooks,Sheets,Cells.Workbook就是一个e ...

  9. python库--tensorflow--io操作

    方法 返回值类型 参数 说明 .train.Saver() 实例s var_list=None 指定被保存和恢复的变量 dict: {name: 变量} list: [变量] None: 所有save ...

随机推荐

  1. org.hibernate.TypeMismatchException: Provided id of the wrong type for class *** Expected ***

    今天上生产发现warn日志有异常,就查看了下: 2018-12-05 10:05:05.666 [pool-4-thread-1] ERROR org.springframework.batch.co ...

  2. mysql启动关闭脚本

    #!/bin/sh mysql_port= mysql_username="root" mysql_password="" function_start_mys ...

  3. 学习ES7+ES8

    es6 语法:http://es6.ruanyifeng.com/#docs/async    作者:阮一峰 撰文为何 身为一个前端开发者,ECMAScript(以下简称ES)早已广泛应用在我们的工作 ...

  4. ubuntu 无法访问windows使用的磁盘

    安装双系统的电脑,正常情况下Ubuntu是可以访问windows下使用的磁盘的, 当出现如下图所示问题时: Windows没有正常关闭. 解决方法: sudo apt-get install ntfs ...

  5. centos7 设置 防火墙 开机自启

    CentOS 7.0默认使用的是firewall作为防火墙,之前版本是使用iptables. 1.设置firewall开机启动 systemctl enable firewalld 2.禁止firew ...

  6. Windows Bat 之For 循环

        Windows Bat 之For 循环 1. For 循环基本用法. 1.1 格式 在cmd窗口中: FOR %variable IN (set) DO command [command-pa ...

  7. VituralBox从零搭建基于CentOS 7(64位)的Kubernetes+docker集群

    1. 下载CentOS 7官方minimal镜像 2. 安装VituralBox(Windows 10 64位) 3. 安装Git for windows(Windows 10 64位) 4. 安装V ...

  8. 简单了解sshd_config配置文件

    OpenSSH(即常说的ssh)的常用配置文件有两个/etc/ssh/ssh_config和sshd_config.,其中ssh_config为客户端配置文件,设置与客户端相关的应用可通过此文件实现: ...

  9. java+上传大文件

    在Web应用系统开发中,文件上传和下载功能是非常常用的功能,今天来讲一下JavaWeb中的文件上传和下载功能的实现. 先说下要求: PC端全平台支持,要求支持Windows,Mac,Linux 支持所 ...

  10. Equals和GetHashCode

    Q:2个方法同时被重写的场景? A:Dictionary或HashTable的key使用时,必须重写这两个方法; 因为:根据key取值的时候也是把key转换成HashCode并且验证Equals后再取 ...