python之openpyxl快速读取Excel表内容

学习目录

了解下电脑中的excel表格文件格式

安装openpyxl库

使用openpyxl库

读取表格内容 

1 先准备一个表格‘python.xlsx’,表格中包含如下几个sheet页

2 导入openpyxl库的load_workbook函数

3 用一个图展示下读取表格常用的函数(WorkBook和Worksheet类中的函数)

4 分别展示如何按单元格/按行/按列获取值

4.1 几种获取不同sheet页对象的方式

4.2 values属性函数:按行获取每个单元格的值

4.3 cell()函数:返回某个单元格的对象,并且支持设置单元格的值

4.4 rows属性函数:返回每行中的所有的单元格对象,并不是单元格的值

4.4 iter_rows函数:返回指定行和列中的所有的单元格对象或者单元格的值

4.5 columns属性函数:返回每列中的所有的单元格对象,并不是单元格的值

4.6 iter_cols函数:返回指定列和行中的所有的单元格对象或者单元格的值

5 像获取列表元素一样获取表格中的内容

6 支持sheet页对象作为可迭代对象

 

d8cdf4e64c1ac08d91ad6c43ad856363.png

Excel表格是大家经常用到的文件格式,各行各业都会跟它打交道。之前文章我们介绍了使用xlrd库读取excel表数据,本次本次我们介绍另一个常用的库openpyxl用于读取和写入excel表。

官网文档:

https://openpyxl.readthedocs.io/en/stable/

官网显示,openpyxl是一个用于读/写Excel2010后缀为XLSX/XLSM/XLTX/XLTM文件的python库。

了解下电脑中的excel表格文件格式

微软或者金山的excel表格编辑保存时一般要选择文件后缀,有xls和xlsx两类。

xls和xlsx后缀文件的主要区别:

  • 文件格式:xls是二进制格式,而xlsx是基于XML的压缩方式。

  • 版本:xls是Excel 2003及以前版本生成的文件格式,而xlsx是Excel 2007及以后版本生成的文件格式。

  • 兼容性:xlsx格式向下兼容,而xls格式不支持向后兼容。

  • 安装openpyxl库

    pip install openpyxl -i https://mirrors.aliyun.com/pypi/simple/

    目前最新版本3.1.5,安装后目录结果如下,初始化文件__init__.py文件如下:

    0fd3039a32d8524a74ea30c0cdb4a447.png

    使用openpyxl库

    初始化文件__init__.py文件已经导入了load_workbook函数:

    8af48edf3e99cc4e48a5995a33b90aaa.png

    该函数主要用于读取excel表数据,使用时我们只需要通过如下命令直接导入即可:

    from openpyxl import load_workbook

    不过该load_workbook函数经过层层调用,最终还是使用openpyxl.workbook.Workbook类,通过Workbook类可处理不同的sheet页对象(class为openpyxl.worksheet. worksheet.Worksheet),通过sheet对象的函数来获取表格中的内容。

    读取表格内容

    1 先准备一个表格‘python.xlsx’,表格中包含如下几个sheet页。

    d4cc88d28eb35bfda90430c2fc399ccb.png

    2 导入openpyxl库的load_workbook函数

    from openpyxl import load_workbook

    #读取python.xlsx表

    wb = load_workbook('/Users/Downloads/python.xlsx')

    3 用一个图展示下读取表格常用的函数(WorkBook和Worksheet类中的函数)

    19a8c7a7aa7c15d2f9795ad395648f51.png

    4 分别展示如何按单元格/按行/按列获取值

    4.1 几种获取不同sheet页对象的方式

    打开excel表

    wb = load_workbook('/Users/Downloads/python.xlsx')

    1)使用wb.active属性函数获取sheet对象

    #获取表格打开能看到的sheet页,一般是默认第1个,也可以选择其他并保存后,获取的就是保存后的sheet页对象
    sheet = wb.active

    #指定获取第N个sheet页对象

    wb.active = 1

    sheet = wb.active

    2)使用wb._sheets获取所有sheet页对象列表,并通过index获取单个sheet页对象
    sheet = wb._sheets[0]

    3)使用wb.sheetnames获取所有sheet页名称,并通过wb[sheetname]获取sheet页对象
    sheetnames = wb.sheetnames

    print(sheetnames )
    sheet = wb['functions'] 
    4)使用wb.worksheets获取所有sheet页对象列表,并通过index获取单个sheet页对象

    print(wb.worksheets)
    sheet = wb.worksheets[0]

    4.2 values属性函数:按行获取每个单元格的值

    values属性函数返回的是生成器,我们可以循环获取每一行的值(每一行为一个元组tuple)

    13a4a1b4735b6bda7f5711ad83eeb657.png

    测试代码:

    wb = load_workbook('/Users/Downloads/python.xlsx')
    sheet0 = wb.worksheets[0]
    for i in sheet0.values:
       print(i)

    结果:每一行返回一个元组,每个元组中是每一行中单元格中的值

    5faa22a814a5babc535062a4c3f15f49.png

    4.3 cell()函数:返回某个单元格的对象,并且支持设置单元格的值

    cell函数的参数:

  • row代表第几行,column代表第几列,需要大于等于1,都则会报错,
  • value参数如果传值会设置为该单元格的值
  • 8d98fbc9404cedcb19befa9843e07ab8.png

    以上函数返回的是单元格对象,class为openpyxl.cell.cell.Cell

    c52e0596ef80f34d293113b7b60f5ec9.png

    Cell对象的几个属性:

  • value : 单元格的值
  • row:单元格所在的行数
  • column:单元格所在的列数
  • data_type:单元格内容对应的数据类型
  • 测试代码:

    wb = load_workbook('/Users/Downloads/python.xlsx')
    sheet0 = wb.worksheets[0]
    #获取第2行第7列的单元格对象
    cell_ins = sheet0.cell(2,7)
    #打印对象对应的属性值
    print(cell_ins.row)
    print(cell_ins.column)
    print(cell_ins.value)
    print(cell_ins.data_type)
    结果:
    2
    7
    pow()
    s

    4.4 rows属性函数:返回每行中的所有的单元格对象,并不是单元格的值

    rows函数调用iter_rows函数,而iter_rows函数调用的是_cells_by_row函数,最终结果返回的是yield生成器(生成器返回的是每一行中每个单元格Cell对象组成的元组)

    7cb9a5f08c2b2244936176c1d593c4d4.png

    测试代码:

    wb = load_workbook('/Users/Downloads/python.xlsx')
    sheet0 = wb.worksheets[0]
    #循环获取每个单元格的值
    for i in sheet0.rows: #返回一个元组
      for cell in i: #循环处理每个单元格
        print(cell.value,end=' ')

    结果:

    35108594819ad6a7567faa30c8a91183.png

    4.4 iter_rows函数:返回指定行和列中的所有的单元格对象或者单元格的值

    iter_rows函数调用的是_cells_by_row函数,最终结果返回的是yield生成器(生成器返回的是每一行中每个单元格Cell对象或者值组成的元组)

    iter_rows函数与rows属性函数不同点在于: iter_rows函数可以传入指定行和列的参数,而且还可以指定是不是返回单元格的值。

  • min_row和ma_row传行数,比如1到3行
  • min_col和max_col传列数,比如2到4列
  • values_only:等于True代表返回单元格的值,默认等于False代表返回单元格对象
  • 7cb9a5f08c2b2244936176c1d593c4d4.png

    测试代码:

    1)指定返回第3行到第5行,第3列到第6列的单元格的值(指定参数values_only=True)

    wb = load_workbook('/Users/Downloads/python.xlsx')
    sheet0 = wb.worksheets[0]
    for i in sheet0.iter_rows(min_row=3,max_row=5,min_col=3,max_col=6,values_only=True):
      for value in i:
         print(value,end=' ')

    27eddb2da7ac3d92a7451472ae8eaf57.png

    2)指定返回第3行到第5行单元格的对象,并打印对应单元格的值

    wb = load_workbook('/Users/Downloads/python.xlsx')
    sheet0 = wb.worksheets[0]
    for i in sheet0.iter_rows(min_row=3,max_row=5):
      for cell in i:
        print(cell.value,end=' ')

    结果:

     

    ee5af58907c55c2e6c29b12b34d2763d.png

    4.5 columns属性函数:返回每列中的所有的单元格对象,并不是单元格的值

    columns函数调用iter_cols函数,而iter_cols函数调用的是_cells_by_col函数,最终结果返回的是yield生成器(生成器返回的也是是每一行中每个单元格Cell对象组成的元组)

    b64f135df29eaacca49c375ebcd89356.png

    测试代码:

    wb = load_workbook('/Users/Downloads/python.xlsx')
    sheet0 = wb.worksheets[0]
    #循环每一列获取每个单元格的值
    for i in sheet0.columns:
      for cell in i:
         print(cell.value,end=' ')

    结果:

     

    ad58f751dbd66e28c34ace7b802f5800.png

    4.6 iter_cols函数:返回指定列和行中的所有的单元格对象或者单元格的值

    iter_cols函数调用的是_cells_by_col函数,最终结果返回的是yield生成器(生成器返回的是每一行中每个单元格Cell对象或者值组成的元组)

    iter_cols函数与columns属性函数不同点在于: iter_cols函数可以传入指定行和列的参数,而且还可以指定是不是返回单元格的值。

  • min_col和max_col传列数,比如2到4列
  • min_row和ma_row传行数,比如1到3行
  • values_only:等于True代表返回单元格的值,默认等于False代表返回单元格对象
  • 测试代码:

    1)指定返回第3行到第5行,第3列到第6列的单元格的值(指定参数values_only=True)

    wb = load_workbook('/Users/Downloads/python.xlsx')
    sheet0 = wb.worksheets[0]
    for i in sheet0.iter_cols(min_row=3,max_row=5,min_col=3,max_col=6,values_only=True):
      for value in i:
        print(value,end=' ')

    结果:

     

    f4ece148f77140cf732ff4d76bd2f02b.png

    2)指定返回第3列到第5列的单元格的对象,并打印对应单元格的值

    wb = load_workbook('/Users/Downloads/python.xlsx')
    sheet0 = wb.worksheets[0]
    for i in sheet0.iter_cols(min_col=3,max_col=5):
      for cell in i:
        print(cell.value,end=' ')

    结果:

     

    92a46945076d35dac05b9936730db303.png

    5 像获取列表元素一样获取表格中的内容。

    之前文章我们讲过,在类中实现了__getitem__魔法方法,我们就可以对该类的对象,像获取列表元素等方式来获取对象的内容。

    12e0a00de9960450a8ae60819a779e29.png

    我们可以按照如下获取表中单元格的对象

  • 传入单个单元格: 比如A1代表第1行第1列的单元格,D24代表第24行第4列的单元格; 返回的是单元格对象
  • 传入多行多列:比如A1:D25代表从第1行第1列到第25行第4列这些范围的单元格,返回的是iter_rows函数的结果
  • 传入多行:比如1:25代表从第1行到第25行所有的单元格,返回的是iter_rows函数的结果
  • 传入多列:比如A:D代表从第1列到第4列所有的单元格,返回的是iter_rows函数的结果
  • 测试代码: 以上4种方式打印下单元格内容

    print(sheet0['D2'].value)
    
    for i in sheet0['A1:D4']:
      for cell in i:
        print(cell.value,end=' ')
    print('\n')
    
    for i in sheet0['A:B']:
      for cell in i:
        print(cell.value,end=' ')
    print('\n')
    
    for i in sheet0['2:3']:
      for cell in i:
        print(cell.value,end=' ')
    print('\n')

    结果:

     

    007c1435383226b89dcfd8a7bbccaef2.png

    6 支持sheet页对象作为可迭代对象

    像使用list tuple可迭代对象一样,对sheet页对象作为可迭代对象使用(类中实现了__iter__魔法方法)

    69d9e8c5918e4271b50ba1c055e04fc9.png

    测试代码:对sheet2对象循环处理

    wb = load_workbook('/Users/Downloads/python.xlsx')
    sheet2 = wb.worksheets[2]
    for i in sheet2:
      for cell in i:
        print(cell.value,end=' ')

     

    共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”

    —–指水滴不断地滴,可以滴穿石头;

    —–比喻坚持不懈,集细微的力量也能成就难能的功劳。

    —-感谢读者的阅读和学习,点个赞和关注吧,谢谢大家。

     

     

     

     

    作者:科雷learning

    物联沃分享整理
    物联沃-IOTWORD物联网 » python之openpyxl快速读取Excel表内容

    发表回复