python除了熟悉的pandas,openpyxl库也很方便的读取Excel表内容

liftword4周前 (04-01)技术文章12

学习目录

了解下电脑中的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函数:返回指定列和行中的所有的单元格对象或者单元格的值

4.7 属性函数最大行/最大列/最小行/最小列

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

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

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文件如下:

使用openpyxl库

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

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

from openpyxl import load_workbook

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

读取表格内容

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

2 导入openpyxl库的load_workbook函数

from openpyxl import load_workbook

#读取python.xlsx表

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

如果只是读取,不写入,可设置参数read_only=True。设置后如果读取后更新单元格内容会报错

wb = load_workbook('/Users/htsc/Downloads/python.xlsx',read_only=True)
sheet0 = wb.worksheets[0]
sheet0['A1'] = 'ssss'

上述代码执行后会报错如下:

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

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)

测试代码:

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

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

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

cell函数的参数:

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

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

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对象组成的元组)

测试代码:

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

结果:

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代表返回单元格对象

测试代码:

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=' ')

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=' ')

结果:

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

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

测试代码:

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

结果:

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=' ')

结果:

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=' ')

结果:

4.7 属性函数最大行/最大列/最小行/最小列

max_row: 代表最大行

max_column:代表最大列

min_row: 代表最小行

min_column:代表最小列

测试代码:

wb = load_workbook('/Users/Downloads/python.xlsx')
sheet0 = wb.worksheets[0]
#打印最大行 最大列等信息
print(f'max_row: {sheet0.max_row}')
print(f'max_colunn: {sheet0.max_column}')
print(f'min_row: {sheet0.min_row}')
print(f'min_column: {sheet0.min_row}')

结果:

max_row: 14

max_colunn: 7

min_row: 1

min_column: 1

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

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

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

  • 传入单个单元格: 比如A1代表第1行第1列的单元格,D24代表第24行第4列的单元格; 返回的是1格单元格对象
  • 传入多行多列:比如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')

结果:

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

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

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

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


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

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

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

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

相关文章

Python读取Excel文件的方法

方法一:读excel文件单元格数据import xlrdbook = xlrd.open_workbook('fruit.xlsx')print('sheet页名称:',book.sheet_name...

一日一技:使用Python读取Excel文件

安装xlrd模块:pip install xlrd使用xlrd模块,可以从电子表格中检索信息。 例如,可以在Python中完成读取,写入或修改数据的操作。 另外,用户可能必须浏览各种工作表并根据某些条...

python怎么读取excel文件

python怎么读取excel文件?1.首先说明我是使用的python3.5,我的office版本是2010,首先打开dos命令窗,安装必须的两个库,命令是:12pip3 install xlrdPi...

详细实例操作:教你用python如何读取和写入EXCEL里面的数据

前言:今天为大家带来的内容是:PYTHON如何读取和写入EXCEL里面的数据,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下,要是喜欢本文内容的朋友记...

python读取Excel表格

python读取Excel文件有一个专门的第三方库xlrd,我们可以安装一下pip install xlrd有关Excel文件的读取如下path = "./test.xls" '''open_wor...

Python之Pandas使用系列(八):读写Excel文件的各种技巧

介绍:我们将学习如何使用Python操作Excel文件。我们将概述如何使用Pandas加载xlsx文件以及将电子表格写入Excel。如何将Excel文件读取到Pandas DataFrame:和前面的...