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

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

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

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

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

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

  1. #获取活动的sheet
  2. ws = wb.active
  3. #设置sheet的标题
  4. ws.title = "range names"
  5. #创建以Pi为标题的sheet
  6. ws = wb.create_sheet(title="Pi")
  7. #获取标题为Sheet1的sheet
  8. 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)中打开时,保存操作会报错

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

实现需求

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

  1. from openpyxl import load_workbook

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

  1. #源表名称
  2. source_file_name='lalala.xlsx'
  3. #目标表名称
  4. target_file_name='lelele.xlsx'
  5. #源表中要提取信息的sheet
  6. source_sheet_name='Sheet2'
  7. #目标表中要批量复制信息的sheet
  8. target_sheet_name='Sheet2'
  9. #源表中的标题行在哪一行
  10. source_header_row=3
  11. #目标表中的标题行在哪一行
  12. target_header_row=2
  13. #源表中要根据哪一列数据提取信息,根据源表标题行
  14. source_cell_condition='姓名'
  15. #目标表中要根据哪一列数据复制信息,根据目标表标题行
  16. target_cell_condition='姓名'
  17. #源表中要提取信息的列
  18. source_cell_filled='身份证号'
  19. #目标表中要复制信息的列
  20. target_cell_filling='身份证号'

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

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

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

  1. ws_r=wb_r[source_sheet_name]
  2. ws_w=wb_w[target_sheet_name]
  3.  
  4. header_row_r=ws_r[source_header_row]
  5. header_row_w=ws_w[target_header_row]

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

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

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

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

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

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

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

  1. 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. kubernetes部署nginx/tomcat

    kubernetes集群已经部署好了,需要的话可以参考之前的文章https://www.cnblogs.com/winter1519/p/10015420.html [root@master tomc ...

  2. java课后实验性问题5

    课后作业一:字符串加密 程序设计思想: 从键盘获取字符串,将字符串转为字符数组,将每个元素加事前协定的“key”,再转为字符串输出. 程序流程图: 源代码: import java.util.Scan ...

  3. 安装jdk1.8.0_11环境脚本

    安装jdk1.8.0_11的脚本,具体的版本可在脚本中调整,发现最后的重置环境变量没生效,还得再终端界面source /etc/profile [root@ZFVM-APP-- ~]# vim jdk ...

  4. --thunder-lock is available since uWSGI 1.4.6 but never got documentation (of any kind)

    --thunder-lock is available since uWSGI 1.4.6 but never got documentation (of any kind) Serializing ...

  5. app微信支付的集成步骤

    1.引用地址 //微信支付 compile 'com.tencent.mm.opensdk:wechat-sdk-android-with-mta:+' 2.注册 private IWXAPI api ...

  6. Maven IntelliJ

    IntelliJ IDEA 已经内建了对 Maven 的支持.我们在此例中使用的是 IntelliJ IDEA 社区版 11.1. IntelliJ IDEA 的一些特性列出如下: 可以通过 Inte ...

  7. microsoft 官方学习资源

    https://devblogs.microsoft.com/dotnet/  :_NET Blog https://docs.microsoft.com/zh-cn/learn/ :Microsof ...

  8. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_11-freemarker静态化测试-基于模板字符串静态化

    再定义一个测试方法 把拿到的字符串变成模板 加载器设置好了以后, 加一个断点来测试 生成模板文件 上面这种方式很灵活. 最终代码 @Test public void testGenerateHtmlB ...

  9. Apache实现一台服务器上运行多个网站

    总共有三种方法:通过不同的IP地址 通过不同的域名 通过不同的端口号 (1).通过不同的IP地址实现 例如一台CentOS7有两个IP:192.168.5.101和192.168.5.103 [roo ...

  10. delphi 根据数据库结构生成TreeView

    procedure TUIOperate.FillTree(treeview: TTreeView); var   findq: TADOQuery;   node: TTreeNode;     / ...