python 使用openpyxl读取excel数据


Posted in Python onFebruary 18, 2021

openpyxl介绍

​ openpyxl是一个开源项目,它是一个用于读取/写入Excel 2010文档(如xlsx 、xlsm 、xltx 、xltm文件 )的Python库,如果要处理更早格式的Excel文档(xls),需要用到其它库(如:xlrd、xlwt等),这是openpyxl比较其他模块的不足之处。openpyxl是一款比较综合的工具,不仅能够同时读取和修改Excel文档,而且可以对Excel文件内单元格进行详细设置,包括单元格样式等内容,甚至还支持图表插入、打印设置等内容。

​ python中与excel操作相关的模块:

  • ? xlrd库:从excel中读取数据,支持xls、xlsx格式
  • ? xlwt库:对excel进行修改操作,但不支持对xlsx格式的修改
  • ? xlutils库:在xlwt和xlrd中,对一个已存在文件进行修改
  • ? openpyxl库:主要针对xlsx格式的excel进行读取和编辑

openpyxl安装

pip install openpyxl

openpyxl基本概念

  • WorkBook:工作簿对象
  • Sheet:表单对象
  • Cell:表格对象

​ 也就是我们使用excel时可以看到的三个对象,我们操作excel的步骤是打开工作簿,选中表单,对单元格进行操作,而openpyxl的工作原理也是如此。

python 使用openpyxl读取excel数据

openpyxl对excel进行操作

新建excel

import openpyxl

# 创建一个工作簿
workbook = openpyxl.Workbook()
# 创建一个表单
sheet = workbook.create_sheet('表单1')
# 写入一个数据
sheet.cell(row=1, column=1, value="python")
# 保存
workbook.save('test.xlsx')

​ ? 注意点:如果保存的文件名已存在,将会覆盖原来的文件

打开已存在的文件

  • 打开已存在的文件:load_workbook()
  • 获取表单:workbook['表单名']
  • 读取指定表格:cell(row, column).value
import openpyxl

# 打开工作簿
workbook = openpyxl.load_workbook('test.xlsx')
# 获取表单
sheet = workbook['表单1']
# 读取指定的单元格数据
cell = sheet.cell(row=1, column=1).value
print(cell)

​ 运行结果:

C:\software\python\python.exe D:/learn/python24/python_base/test.py
python

Process finished with exit code 0

读取单个单元格

# 方式一:读取A6单元格的值
cell1 = sheet['A6'].value

# 方式二:读取第3行,第4列单元格的值
cell2 = sheet.cell(row=3, column=4).value

读取多个单元格

# 方式一:读取A6单元格的值
cell1 = sheet['A6'].value

# 方式二:读取第3行,第4列单元格的值
cell2 = sheet.cell(row=3, column=4).value

​ 读取多个单元格时,都是以元组的形式返回

其他相关操作

关键代码 相关描述
cell(row, column, value) 写入数据,三个参数分别是行,列,值
cell(row, column).value 获取指定单元格的值,两个参数分别是行,列
workbook.remove('表单名') 删除表单
del workbook['表单名'] 删除表单
workbook.save('文件名') 保存工作簿
sheet.max_row 获取表单数据的总行数
sheet.max_column 获取表单数据的总列数
sheet.rows 获取按行所有的数据
sheet.columns 获取按列所有的数据

​ ? 注意点:

  • openpyxl中列和行的起始标识都是1,不是从0开始
  • 从excel中读取出来的数据只有两种类型,即数值类型和字符串类型
  • 不要随便在表格中敲空格,会影响判断最大行数和最大列数
  • 运行操作excel的代码时,要先关闭在操作系统中打开的相关excel表,否则可能会无法读取/写入数据
  • 写入数据时要执行保存
import openpyxl

# 打开工作簿
wb = openpyxl.load_workbook('test.xlsx')
# 获取表单
sh = wb['表单1']
# 读取指定的单元格数据
res1 = sh.cell(row=1, column=1).value
print(res1)

# 获取最大行数
print(sh.max_row)
# 获取最大列数
print(sh.max_column)

# 按列读取所有数据,每一列的单元格放入一个元组中
print(sh.columns) # 直接打印,打印结果是一个可迭代对象,我们可以转换成列表来查看

# 按行读取所有数据,每一行的单元格放入一个元组中
rows = sh.rows
# print(list(rows)) # 转换成列表之后打印结果为具体的单元格,如下
# [(<Cell '表单1'.A1>, <Cell '表单1'.B1>, <Cell '表单1'.C1>, <Cell '表单1'.D1>, <Cell '表单1'.E1>, <Cell '表单1'.F1>, <Cell '表单1'.G1>),
# (<Cell '表单1'.A2>, <Cell '表单1'.B2>, <Cell '表单1'.C2>, <Cell '表单1'.D2>, <Cell '表单1'.E2>, <Cell '表单1'.F2>, <Cell '表单1'.G2>),
# (<Cell '表单1'.A3>, <Cell '表单1'.B3>, <Cell '表单1'.C3>, <Cell '表单1'.D3>, <Cell '表单1'.E3>, <Cell '表单1'.F3>, <Cell '表单1'.G3>)]


# 我们可以通过for循环以及value来查看单元格的值
for row in list(rows): # 遍历每行数据
 case = [] # 用于存放一行数据
 for c in row: # 把每行的每个单元格的值取出来,存放到case里
  case.append(c.value)
 print(case)

​ 运行结果:

C:\software\python\python.exe D:/learn/python24/python_base/test.py
case_id
3
7
<generator object Worksheet._cells_by_col at 0x0000012FEF90D8B8>
['case_id', 'interface', 'title', 'method', 'url', 'data', 'expected']
[1, 'login', '登录成功', 'post', '/member/login', '{"mobile_phone":"15692004245","pwd":"miki12345"}', "{'code': 0, 'msg': 'OK'}"]
[2, 'login', '登录失败-手机号为空', 'post', '/member/login', '{"mobile_phone":"","pwd":"miki12345"}', "{'code': 2, 'msg': '手机号码为空'}"]

​ excel表中的原数据如下图:

python 使用openpyxl读取excel数据

openpyxl封装

​ 在测试过程中,我们会经常需要访问excel读取测试数据,如果?胺梦室淮挝颐蔷偷饔靡淮?penpyxl,进行打开excel,选取表单,读取数据等操作,将会增加我们的工作量和代码量。凡是需要重复使用的,我们都可以对它进行二次封装,写成我们自己的版本,还可以在封装过程中加入我们想要的内容,使用的时候直接调用即可。

​ 在封装openpyxl时,读取excel时我写了两种实现方法,第一种是读取数据后,把每条测试数据的键值保存到一个字典中,再把字典存到一个列表,这种方式比较容易理解,但是调用的时候需要多敲几个括号或者引号;第二种是把每条测试数据的键值存到一个实例对象的属性中,再把每个实例存到一个列表。实际上他们的作用是一样,只是第二种方式调用时更简单。

# read_excel.py
import openpyxl


class CasesData:
 """用于保存测试用例数据"""
 pass


class ReadExcel:

 def __init__(self, file_name, sheet_name):
  self.file_name = file_name
  self.sheet_name = sheet_name

 def open(self):
  self.wb = openpyxl.load_workbook(self.file_name)
  self.sh = self.wb[self.sheet_name]

 def close(self):
  self.wb.close()

 def read_data(self):
  """按行读取数据,最后返回一个存储字典的列表"""
  self.open()
  rows = list(self.sh.rows)
  titles = []
  for t in rows[0]:
   title = t.value
   titles.append(title)
  cases = []
  for row in rows[1:]:
   case = []
   for r in row:
    case.append(r.value)
   cases.append(dict(zip(titles, case))) # 通过zip聚合打包用例的标题和数据
  self.close()
  return cases

 def read_data_obj(self):
  """按行读取数据,最后返回的是一个存储实例对象的列表"""
  self.open()
  rows = list(self.sh.rows)
  titles = []
  for t in rows[0]:
   title = t.value
   titles.append(title)
  cases = []
  for row in rows[1:]:
   case_obj = CasesData() # 创建一个对象用来保存该行用例数据
   case = []
   for r in row:
    case.append(r.value)
   case_info = dict(zip(titles, case))
   for k, v in case_info.items():
    setattr(case_obj, k, v)
   cases.append(case_obj)
  self.close()
  return cases

 def write_data(self, row, column, msg):
  self.open()
  self.sh.cell(row=row, column=column, value=msg)
  self.wb.save(self.file_name)
  self.close()


if __name__ == '__main__':
 # 直接运行本文件时执行,下面是一个应用实例
 # 需要读取excel时直接调用ReadExcel类
 test = ReadExcel('cases.xlsx', 'login')
 res = test.read_data_obj()	# 最后返回的是一个存储实例对象的列表
 print(res[0].case_id)	# 打印第1个用例的case_id
 print(res[3].title)		# 打印第4个用例的title
 
 test2 = ReadExcel('cases.xlsx', 'login')
 res2 = test2.read_data()	# 最后返回一个存储字典的列表
 print(res2[0]['case_id'])	# 打印第1个用例的case_id
 print(res2[3]['title'])		# 打印第4个用例的title

​ 上面封装的openpyxl中,应用实例的excel表结构如下:

python 使用openpyxl读取excel数据

以上就是python 使用openpyxl读取excel数据的详细内容,更多关于python openpyxl读取excel数据的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
Python 实现删除某路径下文件及文件夹的实例讲解
Apr 24 Python
python实现超简单的视频对象提取功能
Jun 04 Python
Selenium的使用详解
Oct 19 Python
Django unittest 设置跳过某些case的方法
Dec 26 Python
python将数组n等分的实例
Dec 02 Python
使用Pandas将inf, nan转化成特定的值
Dec 19 Python
关于python中的xpath解析定位
Mar 06 Python
Python实现代码块儿折叠
Apr 15 Python
在spyder IPython console中,运行代码加入参数的实例
Apr 20 Python
Pandas之read_csv()读取文件跳过报错行的解决
Apr 21 Python
使用py-spy解决scrapy卡死的问题方法
Sep 29 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 Python
Python用SSH连接到网络设备
Feb 18 #Python
python 实现IP子网计算
Feb 18 #Python
详解python3 GUI刷屏器(附源码)
Feb 18 #Python
基于Python-turtle库绘制路飞的草帽骷髅旗、美国队长的盾牌、高达的源码
Feb 18 #Python
Python如何telnet到网络设备
Feb 18 #Python
Python运算符+与+=的方法实例
Feb 18 #Python
python 获取计算机的网卡信息
Feb 18 #Python
You might like
php 动态多文件上传
2009/01/18 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
php如何修改SESSION的生存存储时间的实例代码
2017/07/05 PHP
php插件Xajax使用方法详解
2017/08/31 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
2019/11/14 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
不能再简单的无闪刷新验证码原理很简单
2007/11/05 Javascript
Iframe thickbox2.0使用的方法
2009/03/05 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
Javascript基础_嵌入图像的简单实现
2016/06/14 Javascript
JavaScript之排序函数_动力节点Java学院整理
2017/06/30 Javascript
小程序自定义组件实现城市选择功能
2018/07/18 Javascript
js中怎么判断两个字符串相等的实例
2019/01/17 Javascript
实例讲解vue源码架构
2019/01/24 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
2019/04/02 Javascript
优雅的使用javascript递归画一棵结构树示例代码
2019/09/22 Javascript
vue2.x数组劫持原理的实现
2020/04/19 Javascript
jQuery实现朋友圈查看图片
2020/09/11 jQuery
通过数据库对Django进行删除字段和删除模型的操作
2015/07/21 Python
Python使用Matplotlib实现雨点图动画效果的方法
2017/12/23 Python
python中从str中提取元素到list以及将list转换为str的方法
2018/06/26 Python
python2.7使用plotly绘制本地散点图和折线图
2019/04/02 Python
用Python做一个久坐提醒小助手的示例代码
2020/02/10 Python
基于python检查SSL证书到期情况代码实例
2020/04/04 Python
Python 2.6.6升级到Python2.7.15的详细步骤
2020/12/14 Python
Mountain Warehouse澳大利亚官网:欧洲家庭户外品牌倡导者
2016/11/20 全球购物
KLOOK客路:发现更好玩的世界,预订独一无二的旅行体验
2016/12/16 全球购物
德尔福集团DELPHI的笔试题
2012/02/22 面试题
乡镇党的群众路线对照检查材料
2014/09/24 职场文书
2014城乡环境综合治理工作总结
2014/12/19 职场文书
2015公务员年度考核评语
2015/03/25 职场文书
党风廉政建设心得体会
2019/05/21 职场文书
2019员工保密协议书(3篇)
2019/09/23 职场文书
python opencv通过按键采集图片源码
2021/05/20 Python
Python何绘制带有背景色块的折线图
2022/04/23 Python
Spring boot admin 服务监控利器详解
2022/08/05 Java/Android