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爬虫教程之爬取百度贴吧并下载的示例
Mar 07 Python
windows系统中python使用rar命令压缩多个文件夹示例
May 06 Python
python入门前的第一课 python怎样入门
Mar 06 Python
深入浅析python 中的匿名函数
May 21 Python
python 匹配url中是否存在IP地址的方法
Jun 04 Python
在Python中输入一个以空格为间隔的数组方法
Nov 13 Python
python实现PID算法及测试的例子
Aug 08 Python
Python实现微信翻译机器人的方法
Aug 13 Python
pytorch 共享参数的示例
Aug 17 Python
python实现从ftp上下载文件的实例方法
Jul 19 Python
Python faker生成器生成虚拟数据代码实例
Jul 20 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 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
德生S2000电路分析
2021/03/02 无线电
第八节 访问方式 [8]
2006/10/09 PHP
php接口和抽象类使用示例详解
2014/03/02 PHP
php数组指针操作详解
2017/02/14 PHP
详解php实现页面静态化原理
2017/06/21 PHP
封装好的省市地区联动控件附下载
2007/08/13 Javascript
JavaScript中的闭包原理分析
2010/03/08 Javascript
一个JQuery操作Table的代码分享
2012/03/30 Javascript
Javascript 面向对象(二)封装代码
2012/05/23 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
jQuery模拟超链接点击效果代码
2013/04/21 Javascript
Vuejs入门教程之Vue生命周期,数据,手动挂载,指令,过滤器
2017/04/19 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
Node.js中环境变量process.env的一些事详解
2017/10/26 Javascript
angular中ui calendar的一些使用心得(推荐)
2017/11/03 Javascript
Vue render渲染时间戳转时间,时间转时间戳及渲染进度条效果
2018/07/27 Javascript
解决angular2 获取到的数据无法实时更新的问题
2018/08/31 Javascript
关于单文件组件.vue的使用
2018/09/20 Javascript
100行代码实现一个vue分页组功能
2018/11/06 Javascript
bootstrap 日期控件 datepicker被弹出框dialog覆盖的解决办法
2019/07/09 Javascript
layui实现左侧菜单点击右侧内容区显示
2019/07/26 Javascript
微信小程序实现写入读取缓存详解
2019/08/30 Javascript
js实现轮播图特效
2020/05/28 Javascript
Python中list列表的一些进阶使用方法介绍
2015/08/15 Python
Python简单格式化时间的方法【strftime函数】
2016/09/18 Python
使用Python爬取最好大学网大学排名
2018/02/24 Python
澳洲在线厨具商店:Kitchen Style
2018/05/05 全球购物
如何防止同一个帐户被多人同时登录
2013/08/01 面试题
物业管理计划书
2014/01/10 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
秋季运动会开幕词
2015/01/28 职场文书
《小小的船》教学反思
2016/02/18 职场文书
2017年寒假社区服务活动总结
2016/04/06 职场文书
go语言中GOPATH GOROOT的作用和设置方式
2021/05/05 Golang
redis实现共同好友的思路详解
2021/05/26 Redis
Python 一键获取电脑浏览器的账号密码
2022/05/11 Python