在日常的数据处理工作中,我们经常会有批量处理Excel文件的需求。比如历史上定期的Excel报价表格,或者是会员信息等等。针对多个文件的数据处理,VBA宏是一种方案,而用Python进行处理也是一种好的办法。

这两天看见人力忙着核对绩效,手动工作量十分大,于是我主动提出帮她们减轻负担啦!她们的需求是每月有一批绩效考核文件,需要打开每个核对与汇总绩效成绩是否一致。 
说明:Python的Excel包有很多,我使用的是xlrd包,地址: https://pypi.python.org/pypi/xlrd/0.9.2 。
首先我们要明白excel文件的组织结构:

cell:单元格。就是excel表中一个个的小格子,我们在里面输入数据,也可以通过行与列来表示这个小格子的位置;
sheet:工作表。我们通常新建一个新的excel,会在excel界面的底部看到有个3个新的工作表-”sheet1,sheet2,sheet3“。一个工作表是由N多个cell单元格组成,他是excel文件的中层结构。
Excel文件:office官方文档称呼为”工作簿“,它由多个sheet组成,是excel的最高层。

理解了上面excel组织结构后,我们就能很好的理解excel的相关函数了。
从最简单的一段代码说起:


   1:  import xlrd #引入包

   2:  book = xlrd.open_workbook("myfile.xls") 

   3:  #创建一个book class,打开excel文件

   4:  print "The number of worksheets is", book.nsheets 

   5:  # nsheets属性记录一个excel文件中有多少个sheet

   6:  print "Worksheet name(s):", book.sheet_names() 

   7:  #返回sheet name的list

   8:  sh = book.sheet_by_index(0)   

   9:  #获取一个sheet对象

  10:  print sh.name, sh.nrows, sh.ncols   

  11:  # sheet的属性:name,rows,cols

  12:  print "Cell D30 is", sh.cell_value(rowx=29, colx=3) 

  13:  #定位一个cell

  14:  for rx in range(sh.nrows):

  15:      print sh.row(rx)  #按照row输出excel数据

  16:   

上面这段代码打开了一个叫”myfile.xls“的文件,使用的方法是xlrd.open_workbook()。我们知道一个excel文件中可以有多个sheet,所以我们可以用book.nsheets属性知道这个文件有多少个sheet.

接下来是获取sheet的操作:使用book.sheet_by_index(0)获取第一个sheet对象。我们获取sheet对象,可以使用index定位,也可以使用name定位,比如sheet_by_name(xxx)。

获取完sheet对象后,就可以读取具体的单元格数据啦。按行读取,按列读取等可以按需选择。

附:之前需求的处理代码,其实很简单:

   1:  def get_kpi(file):
   2:      book = xlrd.open_workbook(file)    
   3:      #print "The number of worksheets is", book.nsheets
   4:      for shnum in range(0,book.nsheets):
   5:          rowx=0
   6:          sh = book.sheet_by_index(shnum)
   7:          if re.search('he',sh.name)!=None:
   8:              pass
   9:          else:
  10:              rowx=sh.col_values(0).index(u'总评得分:')
  11:              for rVaule in sh.row_slice(rowx,1,3):
  12:                  if rVaule.ctype==2:
  13:                      print sh.name,rVaule.value