用python库openpyxl操作excel,从源excel表中提取信息复制到目标excel表中

≯℡__Kan透↙ 提交于 2019-11-30 14:58:46

现代生活中,我们很难不与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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!